在 Go 中,如果我从字符串 -> []byte 或相反,从 []byte -> 字符串转换,数据是否会被破坏。例如,假设我已经定义:
fooBytes := []byte(fooString)
fooConvertedBack := string(fooBytes
fooBytesConvertedBack := []byte(fooConvertedBack)
那么我们可以得到这样一种数据被破坏的情况:
fooString != fooConvertedBack
fooBytes != fooBytesConvertedBack
我猜答案是否定的。我正在处理随机字节数组,我想确保不会破坏数据,因为例如,golang 字符串有一个默认字符集,它不允许完全随机的字节。
base64编码字节更好吗?
最佳答案
正如 Cerise Limón 所写,它不会被破坏。 string
和 []byte
之间的转换不会解释字节,它只是按原样复制它们。
但是请注意,如果您要在 string
和 []rune
之间进行转换,那可能会更改内容,因为如 Spec: Conversions to and from a string type 中所写:
Converting a value of a string type to a slice of runes type yields a slice containing the individual Unicode code points of the string.
所以这个转换解码 rune (Unicode 代码点),如果输入的 string
不是有效的 UTF-8 编码文本,Unicode 替换字符 0xFFFD
将是在这种情况下使用。
例如,包含单个 0xff
字节的 string
不是有效的 UTF-8 编码文本:
fooString := "\xff"
barString := string([]rune(fooString))
fmt.Println(fooString == barString)
fmt.Printf("%x %x", fooString, barString)
输出(在 Go Playground 上尝试):
false
ff efbfbd
(注意:十六进制efbfdb
是Unicode替换字符0xFFFD
的3字节UTF-8编码值。)
关于string - 我可以破坏 []byte 和字符串之间的数据转换吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56437255/