【问题标题】:How to convert byte array to string in Go [duplicate]如何在Go中将字节数组转换为字符串[重复]
【发布时间】:2017-03-30 16:34:58
【问题描述】:

[]byte 到字符串会引发错误。 string([]byte[:n]) 也会引发错误。 顺便说一下,例如,文件名的 sha1 值到字符串。 它是否需要 utf-8 或任何其他明确的编码集? 谢谢!

【问题讨论】:

  • []byte 可以直接转换为string。请举例说明您遇到的问题。
  • 例如。文件哈希值到文件名的字符串
  • 如果您只是向我们展示您尝试过的示例,这将是一个非常容易回答的问题,而不是等待我们猜测正确答案。
  • 在大多数现代语言中,他想要做什么是非常清楚的,可悲的是,不需要任何额外的上下文。我还偶然发现了这个问题,正在寻找相同的答案(如下所示)。

标签: go types sha1


【解决方案1】:

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

myString := string(myBytes[:])

【讨论】:

  • 为什么是:?这个答案和myString := string(myBytes)有什么区别?
  • : 是必需的,因为字节 arrays 不能直接转换为字符串,而切片可以。假设我们有 var b [64]bytestring(b) 将失败,而 string(b[:]) 将起作用。
【解决方案2】:
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 是一个切片。

【讨论】:

    【解决方案3】:

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

    myString := string(myBytes)
    

    注意:要像您要求的那样将“sha1 值转换为字符串”,首先需要对其进行编码,因为哈希是二进制的。 SHA 哈希的传统编码是十六进制 (import "encoding/hex"):

    myString := hex.EncodeToString(sha1bytes)
    

    【讨论】:

    • 太棒了,在 golang 中将字节编码为字符串非常方便!
    【解决方案4】:

    我们只能猜测您的代码有什么问题,因为没有提供有意义的示例。但首先我看到string([]byte[:n]) 根本无效。 []byte[:n] 不是有效的表达式,因为没有为数组分配内存。由于字节数组可以直接转换为字符串,我假设您只是语法错误。

    最短的有效时间是fmt.Println(string([]byte{'g', 'o'}))

    【讨论】:

      【解决方案5】:

      我不确定我是否正确理解了问题,但可能是:

      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-

      【讨论】:

      • 虽然技术上是正确的,但在 Go 中使用 var 并声明每种类型而不只是推断它们是相当不寻常的。 play.golang.org/p/JUl57LKfzk
      • 啊! “%X”!那是我做错了! :) 我使用了错误的 Sprintf 占位符,呃...
      • 你也可以用hex.EncodeToString代替fmt.Sprintf("%x", ...)
      【解决方案6】:

      在 Go 中,您通过执行 string(bytes) 将字节数组 (utf-8) 转换为字符串,因此在您的示例中,它应该是 string(byte[:n]) 假设 byte 是字节切片。

      【讨论】:

      • 我刚刚尝试过这样,但失败了。实际上,我需要将文件 sha1 值转换为字符串,以文件名命名
      【解决方案7】:

      首先,您会收到所有这些负面评论,因为您没有提供任何代码。 第二,没有好的例子。这就是我要做的

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

      或者更好

      myString := string(someByteArray[:n])
      

      here 也见@JimB 的评论

      话虽如此,如果您帮助针对您的程序的目标,请提供您尝试过的内容、预期结果和错误的示例。

      【讨论】:

      • 非常感谢。 EncodeToString 返回 src 的十六进制编码。效果很好。
      猜你喜欢
      • 2021-08-29
      • 2012-07-24
      • 1970-01-01
      • 2014-12-07
      • 2013-07-24
      • 2017-05-20
      • 2017-02-14
      • 1970-01-01
      • 2012-04-07
      相关资源
      最近更新 更多