Могу ли я испортить преобразование данных между байтом [] и строкой? - PullRequest
0 голосов
/ 04 июня 2019

В Go, если я преобразую из строки -> [] байт или, наоборот, из строки [] byte ->, могут ли данные быть повреждены. Например, допустим, я определил:

fooBytes := []byte(fooString)
fooConvertedBack := string(fooBytes
fooBytesConvertedBack := []byte(fooConvertedBack)

Тогда мы можем получить случай, когда данные будут повреждены, так что:

fooString != fooConvertedBack
fooBytes != fooBytesConvertedBack

Я предполагаю, что ответ здесь - нет. Я работаю со случайными массивами байтов и хочу убедиться, что я не испорчу данные, потому что, например, строка golang имеет набор символов по умолчанию, который не допускает полностью случайных байтов.

Лучше ли base64 кодировать байты?

Ответы [ 3 ]

6 голосов
/ 04 июня 2019

Как писал Cerise Limón, он не будет поврежден. Преобразование между string и []byte не интерпретирует байты, оно просто копирует их как есть.

Обратите внимание, что если вы конвертируете между string и []rune, это может изменить содержимое, как написано в Spec: преобразования в и из строкового типа :

Преобразование значения типа строки в фрагмент типа руны дает фрагмент, содержащий отдельные кодовые точки Unicode строки.

Таким образом, это преобразование декодирует руны (кодовые точки Unicode), и если ввод string не является допустимым текстом в кодировке UTF-8, в таких случаях будет использоваться символ замены Unicode 0xFFFD.

Например, string, содержащий один байт 0xff, не является допустимым текстом в кодировке UTF-8:

fooString := "\xff"
barString := string([]rune(fooString))
fmt.Println(fooString == barString)
fmt.Printf("%x %x", fooString, barString)

Выходы (попробуйте на Go Playground ):

false
ff efbfbd

(Примечание: шестнадцатеричный код efbfdb - это 3-байтовое кодированное UTF-8 значение заменяющего символа Unicode 0xFFFD.)

4 голосов
/ 04 июня 2019

Нет, данные не будут повреждены. Преобразования копируют байты без интерпретации того, что это за байты. Вот соответствующие предложения из спецификации :

Преобразование фрагмента байтов в строковый тип приводит к строке, последовательные байты которой являются элементами фрагмента.

и

Преобразование значения типа строки в тип фрагмента байтов дает фрагмент, последовательные элементы которого являются байтами строки.

Строки Go могут содержать произвольные последовательности байтов.

1 голос
/ 04 июня 2019

Вы можете конвертировать string в []byte или наоборот, БЕЗОПАСНО .

Из спецификации Голанга :

Строковое значение - это (возможно, пустая) последовательность байтов.

Также из официального блога :

В Go строка является фактически доступным только для чтения срезом байтов.

...