如何在Go中将字节数组转换为字符串

151

[]byte 转为字符串会引发错误。 string([]byte[:n]) 也会引发错误。 另外,例如将 SHA1 值转换为文件名时,需要显式设置 UTF-8 或其他编码吗? 谢谢!


8
[]byte 可以直接转换为 string。请给出一个例子说明您遇到的问题。 - JimB
将文件的哈希值转换为文件名字符串。 - lindsay show
1
如果您可以给我们展示一下您尝试过的示例,那么这将是一个非常容易回答的问题,而不必让我们猜测正确的答案。 - JimB
在大多数现代语言中,他试图做什么是非常清楚的,可惜没有任何额外的上下文需要。我也在寻找同样的答案时偶然发现了这个问题(如下所答)。 - milosmns
@JimB 字节数组不能直接转换为字符串,只能使用字节切片。 - Rawley Fowler
你可以使用base64进行编码,这可能比十六进制更短。导入"encoding/base64"即可。 - undefined
7个回答

187

我用的最简单的将 byte 转换为 string 的方法是:

myString := string(myBytes[:])

20
为什么要使用:?这个答案和myString := string(myBytes)有什么不同? - Ferran Maylinch
17
需要使用冒号 : 是因为字节数组无法直接转换为字符串,而切片可以。假设我们有 var b [64]bytestring(b) 将会失败,但是 string(b[:]) 就能成功转换。 - MKrup

111

在Go语言中将[]byte转换为string最简单的方法:

myString := string(myBytes)

注意:如果要将像您询问的"sha1值转换为字符串",需要首先进行编码,因为哈希是二进制的。 SHA哈希的传统编码是十六进制(import "encoding/hex"):

myString := hex.EncodeToString(sha1bytes)

太棒了,在golang中将字节编码为字符串非常方便! - Rajan Ponnappan
字符串中是否包含字节的副本? - ceving
是的,它包含了字节的不可变副本。 - rustyx

16
在Go中,将字节数组(utf-8)转换为字符串的方法是使用 string(bytes),因此在您的示例中,假设byte是一个字节切片,则应该使用string(byte[:n])

我刚尝试了这样做,但失败了。实际上,我需要将文件的sha1值转换为字符串,并命名为文件名。 - lindsay show

15

我不确定我是否正确理解了问题,但也许是这样:

var ab20 [20]byte = sha1.Sum([]byte("filename.txt"))
var sx16 string = fmt.Sprintf("%x", ab20)
fmt.Print(sx16)

https://play.golang.org/p/haChjjsH0-


1
虽然从技术上讲是正确的,但在Go语言中使用var并声明每个类型而不仅仅是推断它们是相当不寻常的。https://play.golang.org/p/JUl57LKfzk - JimB
1
啊!“%x”!这就是我错了的地方!:) 我使用了错误的Sprintf占位符,真蠢... - Gwyneth Llewelyn
你也可以使用 hex.EncodeToString 代替 fmt.Sprintf("%x", ...) - Olshansky

4
ToBe := [6]byte{65, 66, 67, 226, 130, 172}
s:=ToBe[:3]
// this will work
fmt.Printf("%s",string(s))
// this will not
fmt.Printf("%s",string(ToBe))

区别: ToBe是一个数组,而s是一个切片。


1

首先,你之前没有提供任何代码,这就是为什么会收到这些负面评论的原因。 其次,没有一个好的示例。这就是我所做的。

var Buf bytes.Buffer
Buf.Write([]byte)
myString := Buf.String()
Buf.Reset() // Reset the buffer to reuse later

或者更好的是
myString := string(someByteArray[:n])

在这里 查看,同时也请参考 @JimB 的评论。

话虽如此,如果您需要针对程序的帮助,请提供您尝试过的示例、期望的结果和错误信息。


非常感谢。EncodeToString返回src的十六进制编码,它运行良好。 - lindsay show

0
我们无法清楚地判断您的代码哪里有问题,因为没有提供任何有意义的示例。但是首先我看到 string([]byte[:n])根本无效。[]byte[:n]不是一个有效的表达式,因为没有为数组分配内存。由于字节数组可以直接转换为字符串,我认为您只是遇到了语法错误。

最短有效的解决方案是:fmt.Println(string([]byte{'g', 'o'}))


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接