我有一个字节数组,是在执行md5.Sum()之后得到的。
md5.Sum()
data := []byte("testing") var pass string var b [16]byte b = md5.Sum(data) pass = string(b)
我得到错误:无法将b(类型[16] byte)转换为类型string
vdgimpew1#
您可以将其称为切片:
pass = string(b[:])
jhiyze9q2#
有点晚了,但请记住,使用string(b[:])将打印大多数无效字符。如果你想得到一个像php一样的十六进制表示,你可以使用如下代码:
string(b[:])
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)
playground
xuo3flqw3#
它可以这样解决
pass = fmt.Sprintf("%x", b)
或
import "encoding/base64" pass = base64.StdEncoding.EncodeToString(b[:])
这将把它编码为base64字符串
htzpubme4#
切一片:
roqulrg35#
因此,unsafe: add StringData, String, SliceData、reflect.StringHeader和reflect.SliceHeader可能在Go 1.20中弃用。而unsafe.StringData、unsafe.String和unsafe.SliceData将取代它们。
reflect.StringHeader
reflect.SliceHeader
Go 1.20
unsafe.StringData
unsafe.String
unsafe.SliceData
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)) }
虽然这里有一些简单的答案,但我想给出一个更有效的解决方案
func Bytes2StrImp(b []byte) string{ sliceHeader := (*reflect.SliceHeader)(unsafe.Pointer(&b)) sh := reflect.StringHeader{ Data: sliceHeader.Data, Len: sliceHeader.Len, } return *(*string)(unsafe.Pointer(&sh)) // go vet error possible misuse reflect.StringHeader }
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 }
上述解决方案通过Pointer操作将字节数组转换为字符串,string(b[:])将做一个新的字符串对象,将字节数组中的数据复制到字符串中。string(b[:])的基准测试结果一个三个三个一个
nfzehxib6#
你可以试试
b.decode("utf-8")
请告诉我,这对您有帮助吗?强文本
ufj5ltwl7#
不用于打印十六进制编码的字符串,但在 * 一般 * 情况下,当[size]byte数组可能包含无效的UTF-8序列时,则根据this answer,可以使用以下命令将其转换为有效的UTF-8
[size]byte
s := string([]rune(string(b[:])))
Example:
package main import ( "fmt" "unicode/utf8" ) func main() { b := [1]byte{0xff} s := string(b[:]) fmt.Println(s, []byte(s), utf8.Valid([]byte(s))) // Output: � [255] false s = string([]rune(string(b[:]))) fmt.Println(s, []byte(s), utf8.Valid([]byte(s))) // Output: � [239 191 189] true }
k75qkfdt8#
我发现这些注解真的没有帮助,因为它们假设OP只需要[]byte的文字字符串...但是如果你像我一样,需要utf8解码的字节作为字符串,你可以使用以下代码:
import "unicode/utf8" func bytesToUtf8(b []byte) string { var myString = ""; for i := 1; i <= len(b); i++ { r, _ := utf8.DecodeRune(b[i-1:i]) myString += string(r) } return myString } var uselessBytes := []byte{123,34,...} helpfulUtf8String := bytesToUtf8(uselessBytes)
8条答案
按热度按时间vdgimpew1#
您可以将其称为切片:
jhiyze9q2#
有点晚了,但请记住,使用
string(b[:])
将打印大多数无效字符。如果你想得到一个像php一样的十六进制表示,你可以使用如下代码:
playground
xuo3flqw3#
它可以这样解决
或
这将把它编码为base64字符串
htzpubme4#
切一片:
roqulrg35#
因此,unsafe: add StringData, String, SliceData、
reflect.StringHeader
和reflect.SliceHeader
可能在Go 1.20
中弃用。而unsafe.StringData
、unsafe.String
和unsafe.SliceData
将取代它们。虽然这里有一些简单的答案,但我想给出一个更有效的解决方案
上述解决方案通过Pointer操作将字节数组转换为字符串,
string(b[:])
将做一个新的字符串对象,将字节数组中的数据复制到字符串中。string(b[:])
的基准测试结果一个三个三个一个
nfzehxib6#
你可以试试
请告诉我,这对您有帮助吗?强文本
ufj5ltwl7#
不用于打印十六进制编码的字符串,但在 * 一般 * 情况下,当
[size]byte
数组可能包含无效的UTF-8序列时,则根据this answer,可以使用以下命令将其转换为有效的UTF-8Example:
k75qkfdt8#
我发现这些注解真的没有帮助,因为它们假设OP只需要[]byte的文字字符串...但是如果你像我一样,需要utf8解码的字节作为字符串,你可以使用以下代码: