我需要读取[100]字节来传输一堆字符串数据。
因为不是所有的字符串都恰好是100个字符长,所以字节数组的其余部分用0填充。
如果我通过:string(byteArray[:])将[100]字节转换为字符串,则后面的0将显示为^@^@s。
在C语言中,字符串将在0处终止,那么在Go中将这个字节数组转换为字符串的最佳方法是什么?
我需要读取[100]字节来传输一堆字符串数据。
因为不是所有的字符串都恰好是100个字符长,所以字节数组的其余部分用0填充。
如果我通过:string(byteArray[:])将[100]字节转换为字符串,则后面的0将显示为^@^@s。
在C语言中,字符串将在0处终止,那么在Go中将这个字节数组转换为字符串的最佳方法是什么?
当前回答
将数据读入字节片的方法返回已读字节数。您应该保存该数字,然后使用它来创建字符串。如果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)
其他回答
Use:
s := string(byteArray[:])
用这个:
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)
虽然性能不是很好,但唯一可读的解决方案是:
// Split by separator and pick the first one.
// This has all the characters till null, excluding null itself.
retByteArray := bytes.Split(byteArray[:], []byte{0}) [0]
// OR
// If you want a true C-like string, including the null character
retByteArray := bytes.SplitAfter(byteArray[:], []byte{0}) [0]
c风格字节数组的完整示例:
package main
import (
"bytes"
"fmt"
)
func main() {
var byteArray = [6]byte{97,98,0,100,0,99}
cStyleString := bytes.SplitAfter(byteArray[:], []byte{0}) [0]
fmt.Println(cStyleString)
}
一个完整的例子,有一个Go风格的字符串不包括空值:
package main
import (
"bytes"
"fmt"
)
func main() {
var byteArray = [6]byte{97, 98, 0, 100, 0, 99}
goStyleString := string(bytes.Split(byteArray[:], []byte{0}) [0])
fmt.Println(goStyleString)
}
这将分配一个字节切片的切片。因此,如果它被大量或重复使用,请注意性能。
下面是一个删除空字节的选项:
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