我需要读取[100]字节来传输一堆字符串数据。

因为不是所有的字符串都恰好是100个字符长,所以字节数组的其余部分用0填充。

如果我通过:string(byteArray[:])将[100]字节转换为字符串,则后面的0将显示为^@^@s。

在C语言中,字符串将在0处终止,那么在Go中将这个字节数组转换为字符串的最佳方法是什么?


当前回答

用这个:

bytes.NewBuffer(byteArray).String()

其他回答

将数据读入字节片的方法返回已读字节数。您应该保存该数字,然后使用它来创建字符串。如果n是读取的字节数,你的代码看起来像这样:

s := string(byteArray[:n])

要转换完整的字符串,可以使用:

s := string(byteArray[:len(byteArray)])

这相当于:

s := string(byteArray[:])

如果由于某种原因您不知道n,您可以使用bytes包来查找它,假设您的输入中没有嵌入null字符。

n := bytes.Index(byteArray[:], []byte{0})

或者正如icza指出的那样,你可以使用下面的代码:

n := bytes.IndexByte(byteArray[:], 0)

简单的解决方案:

str := fmt.Sprintf("%s", byteArray)

但我不确定它的性能如何。

读取时使用片而不是数组。例如,io。Reader接受片,而不是数组。 使用切片代替零填充。

例子:

buf := make([]byte, 100)
n, err := myReader.Read(buf)
if n == 0 && err != nil {
    log.Fatal(err)
}

consume(buf[:n]) // consume() will see an exact (not padded) slice of read data

仅用于性能调优。

package main

import (
    "fmt"
    "reflect"
    "unsafe"
)

func BytesToString(b []byte) string {
    return *(*string)(unsafe.Pointer(&b))
}

func StringToBytes(s string) []byte {
    return *(*[]byte)(unsafe.Pointer(&s))
}

func main() {
    b := []byte{'b', 'y', 't', 'e'}
    s := BytesToString(b)
    fmt.Println(s)
    b = StringToBytes(s)
    fmt.Println(string(b))
}

用这个:

bytes.NewBuffer(byteArray).String()