如何在Go语言中将[Size]byte转换为string?

csbfibhn  于 2022-12-25  发布在  Go
关注(0)|答案(8)|浏览(172)

我有一个字节数组,是在执行md5.Sum()之后得到的。

data := []byte("testing")
var pass string 
var b [16]byte
b = md5.Sum(data)
pass = string(b)

我得到错误:
无法将b(类型[16] byte)转换为类型string

vdgimpew

vdgimpew1#

您可以将其称为切片:

pass = string(b[:])
jhiyze9q

jhiyze9q2#

有点晚了,但请记住,使用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)

playground

xuo3flqw

xuo3flqw3#

它可以这样解决

pass = fmt.Sprintf("%x", b)

import "encoding/base64"
pass = base64.StdEncoding.EncodeToString(b[:])

这将把它编码为base64字符串

htzpubme

htzpubme4#

切一片:

pass = string(b[:])
roqulrg3

roqulrg35#

    • 2022年7月9日更新**

因此,unsafe: add StringData, String, SliceDatareflect.StringHeaderreflect.SliceHeader可能在Go 1.20中弃用。而unsafe.StringDataunsafe.Stringunsafe.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[:])的基准测试结果
一个三个三个一个

nfzehxib

nfzehxib6#

你可以试试

b.decode("utf-8")

请告诉我,这对您有帮助吗?强文本

ufj5ltwl

ufj5ltwl7#

不用于打印十六进制编码的字符串,但在 * 一般 * 情况下,当[size]byte数组可能包含无效的UTF-8序列时,则根据this answer,可以使用以下命令将其转换为有效的UTF-8

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
}
k75qkfdt

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)

相关问题