我需要读取[100]字节来传输一堆字符串数据。
因为不是所有的字符串都恰好是100个字符长,所以字节数组的其余部分用0填充。
如果我通过:string(byteArray[:])将[100]字节转换为字符串,则后面的0将显示为^@^@s。
在C语言中,字符串将在0处终止,那么在Go中将这个字节数组转换为字符串的最佳方法是什么?
我需要读取[100]字节来传输一堆字符串数据。
因为不是所有的字符串都恰好是100个字符长,所以字节数组的其余部分用0填充。
如果我通过:string(byteArray[:])将[100]字节转换为字符串,则后面的0将显示为^@^@s。
在C语言中,字符串将在0处终止,那么在Go中将这个字节数组转换为字符串的最佳方法是什么?
当前回答
下面是一个删除空字节的选项:
package main
import "golang.org/x/sys/windows"
func main() {
b := []byte{'M', 'a', 'r', 'c', 'h', 0}
s := windows.ByteSliceToString(b)
println(s == "March")
}
https://pkg.go.dev/golang.org/x/sys/unix#ByteSliceToString https://pkg.go.dev/golang.org/x/sys/windows#ByteSliceToString
其他回答
读取时使用片而不是数组。例如,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
将数据读入字节片的方法返回已读字节数。您应该保存该数字,然后使用它来创建字符串。如果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)
例如,
package main
import "fmt"
func CToGoString(c []byte) string {
n := -1
for i, b := range c {
if b == 0 {
break
}
n = i
}
return string(c[:n+1])
}
func main() {
c := [100]byte{'a', 'b', 'c'}
fmt.Println("C: ", len(c), c[:4])
g := CToGoString(c[:])
fmt.Println("Go:", len(g), g)
}
输出:
C: 100 [97 98 99 0]
Go: 3 abc
当你不知道数组中非nil字节的确切长度时,你可以先修剪它:
字符串(字节。修剪(arr, “\x00”))
简单的解决方案:
str := fmt.Sprintf("%s", byteArray)
但我不确定它的性能如何。