我可以破坏[] byte和字符串之间的数据转换吗?

时间:2019-06-04 04:14:42

标签: string go utf-8 character-encoding slice

在Go中,如果我从字符串-> [] byte转换,或者相反,从[] byte->字符串转换,数据可能会被破坏。例如,假设我已经定义:

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

然后我们可以得到一个数据损坏的情况,例如:

fooString != fooConvertedBack
fooBytes != fooBytesConvertedBack

我猜这里的答案是否定的。我正在使用字节的随机数组,因此我想确保不会破坏数据,因为例如golang字符串具有默认字符集,不允许完全随机的字节。

base64编码字节更好吗?

3 个答案:

答案 0 :(得分:6)

正如CeriseLimón所写,它不会被损坏。在string[]byte之间转换不会解释字节,而只是按原样复制它们。

但是请注意,如果您要在string[]rune之间进行转换,则可能会更改内容,如Spec: Conversions to and from a string type所示:

  

将字符串类型的值转换为符文类型的切片会产生一个切片,其中包含字符串的各个Unicode代码点。

因此,此转换将对符文(Unicode代码点)进行解码,并且如果输入string不是有效的UTF-8编码文本,则在这种情况下将使用Unicode替换字符0xFFFD。 / p>

例如,包含单个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是Unicode替换字符0xFFFD的3字节UTF-8编码值。)

答案 1 :(得分:4)

否,数据不会被破坏。转换将复制字节,而不会解释这些字节是什么。以下是specification中的相关句子:

  

将一个字节的切片转换为字符串类型会产生一个字符串,其连续字节是该切片的元素。

  

将字符串类型的值转换为字节类型的切片会产生一个切片,其连续元素是字符串的字节。

Go字符串可以包含任意字节序列。

答案 2 :(得分:1)

您可以将string转换为[]byte,反之亦然,安全

来自golang spec

  

字符串值是一个字节序列(可能为空)。

也来自official blog

  

在Go中,字符串实际上是一个只读字节字节。