【问题标题】:Can I corrupt data converting between []byte and string?我可以破坏 []byte 和 string 之间的数据转换吗?
【发布时间】:2019-10-19 14:13:28
【问题描述】:

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

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

那么我们是否会遇到数据损坏的情况:

fooString != fooConvertedBack
fooBytes != fooBytesConvertedBack

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

对字节进行base64编码更好吗?

【问题讨论】:

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


    【解决方案1】:

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

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

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

    所以这种转换会解码符文(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编码值。)

    【讨论】:

      【解决方案2】:

      不,数据不会损坏。转换复制字节而不解释这些字节是什么。以下是来自specification的相关语句:

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

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

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

      【讨论】:

        【解决方案3】:

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

        来自golang spec

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

        同样来自official blog

        在 Go 中,字符串实际上是只读的字节片。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-10-22
          • 1970-01-01
          • 2016-07-17
          相关资源
          最近更新 更多