登录
首页 >  Golang >  Go问答

我会在字节和字符串之间的数据转换中导致损坏吗?

来源:stackoverflow

时间:2024-03-06 16:51:24 471浏览 收藏

本篇文章向大家介绍《我会在字节和字符串之间的数据转换中导致损坏吗?》,主要包括,具有一定的参考价值,需要的朋友可以参考一下。

问题内容

在 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 中所写:

将字符串类型的值转换为 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 编码值。)

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

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

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>