package util import ( "fmt" "strconv" "strings" euni "golang.org/x/text/encoding/unicode" ) // Decodes given byte into integer func ByteToInt(gByte byte) (int, error) { integer, err := strconv.Atoi(fmt.Sprintf("%d", gByte)) if err != nil { return 0, err } return integer, nil } // Decodes given integer bytes into integer, ignores the first bit // of every given byte in binary form func BytesToIntIgnoreFirstBit(gBytes []byte) (int64, error) { // represent each byte in size as binary and get rid from the first bit, // then concatenate filtered parts var filteredBits string for _, b := range gBytes { // ignore the first bit filteredPart := fmt.Sprintf("%08b", b)[1:] // byte is 8 bits filteredBits += filteredPart } // convert filtered binary into usable int64 integer, err := strconv.ParseInt(filteredBits, 2, 64) if err != nil { return -1, err } return integer, nil } // Converts given bytes into string, ignoring the first 31 non-printable ASCII characters. // (LOSSY, if given bytes contain some nasty ones) func ToStringLossy(gBytes []byte) string { var runes []rune for _, b := range gBytes { if b <= 31 { continue } runes = append(runes, rune(b)) } return strings.ToValidUTF8(string(runes), "") } // Decodes the given frame`s contents func DecodeText(fContents []byte) string { textEncoding := fContents[0] // the first byte is the encoding switch textEncoding { case 0: // ISO-8859-1 return ToStringLossy(fContents[1:]) case 1: // UTF-16 with BOM encoding := euni.UTF16(euni.BigEndian, euni.ExpectBOM) decoder := encoding.NewDecoder() decodedBytes := make([]byte, len(fContents)*2) _, _, err := decoder.Transform(decodedBytes, fContents[1:], true) if err != nil { return "" } return string(decodedBytes) case 2: // UTF-16 encoding := euni.UTF16(euni.BigEndian, euni.IgnoreBOM) decoder := encoding.NewDecoder() decodedBytes := make([]byte, len(fContents)*2) _, _, err := decoder.Transform(decodedBytes, fContents[1:], true) if err != nil { return "" } return string(decodedBytes) case 3: // UTF-8 return ToStringLossy(fContents[1:]) } return "" }