如何在Go中将[Size]字节转换为字符串?

The*_*hna 16 type-conversion go

我有一个大小的字节数组,我做了之后md5.Sum().

data := []byte("testing")
var pass string 
var b [16]byte
b = md5.Sum(data)
pass = string(b)
Run Code Online (Sandbox Code Playgroud)

我收到错误:

无法将b(类型[16]字节)转换为字符串类型

Sim*_*ead 26

您可以将其称为切片:

pass = string(b[:])
Run Code Online (Sandbox Code Playgroud)


One*_*One 24

有点晚,但请记住,使用string(b[:])将打印大多数无效字符.

如果你试图像php一样得到它的十六进制表示,你可以使用类似的东西:

data := []byte("testing")
b := md5.Sum(data)

//this is mostly invalid characters
fmt.Println(string(b[:]))

pass := hex.EncodeToString(b[:])
fmt.Println(pass)
// or
pass = fmt.Sprintf("%x", b)
fmt.Println(pass)
Run Code Online (Sandbox Code Playgroud)

playground

  • @rightfold你到底在争论什么? (2认同)
  • 这是接收 md5 哈希字符串的正确答案。其他一切都没有帮助......需要:`import“encoding/hex”` (2认同)

zan*_*ngw 7

更新 02/01/2023

据此,不安全:添加 StringData、String、SliceData,reflect.StringHeader并且reflect.SliceHeader可能在Go 1.20. 并且unsafe.StringData, unsafe.String, 和unsafe.SliceData将取代它们,请参阅1.20 发行说明

该unsafe包定义了三个新函数SliceData、String和StringData。与 Go 1.17 的 Slice 一起,这些函数现在提供了构造和解构切片和字符串值的完整功能,而不依赖于它们的确切表示。

func String2Bytes(s string) []byte {
    if s == "" {
        return nil
    }
    return unsafe.Slice(unsafe.StringData(s), len(s))
}

func Bytes2String(b []byte) string {
    if len(b) == 0 {
        return ""
    }
    return unsafe.String(unsafe.SliceData(b), len(b))
}
Run Code Online (Sandbox Code Playgroud)

开始之前 1.20

func Bytes2StrImp(b []byte) string {
    sliceHeader := (*reflect.SliceHeader)(unsafe.Pointer(&b))
    var s string
    sh := (*reflect.StringHeader)(unsafe.Pointer(&s))
    sh.Data = sliceHeader.Data
    sh.Len = sliceHeader.Len
    return s
}
Run Code Online (Sandbox Code Playgroud)

上述方案通过Pointer操作将字节数组转换为字符串。将string(b[:])创建一个新的字符串对象并将数据从字节数组复制到字符串。

基准测试结果为string(b[:])

func Bytes2StrRaw(b []byte) string {
    return string(b[:])
}
Run Code Online (Sandbox Code Playgroud)
BenchmarkBytes2StrRaw-12              275305142                4.40 ns/op
BenchmarkBytes2StrImp-12              1000000000               0.315 ns/op
Run Code Online (Sandbox Code Playgroud)

虽然这里有一些简单的答案,但我想给出一种更有效的解决方案

BenchmarkBytes2StrRaw-12              275305142                4.40 ns/op
BenchmarkBytes2StrImp-12              1000000000               0.315 ns/op
Run Code Online (Sandbox Code Playgroud)


小智 5

这可以解决

pass = fmt.Sprintf("%x", b)
Run Code Online (Sandbox Code Playgroud)

要么

import "encoding/base64"
pass = base64.StdEncoding.EncodeToString(b[:])
Run Code Online (Sandbox Code Playgroud)

这会将其编码为base64字符串

  • 这是许多情况下的正确答案,而不是公认的答案 (2认同)