我需要读取[100]字节来传输一堆字符串数据。
因为不是所有的字符串都恰好是100个字符长,所以字节数组的其余部分用0填充。
如果我通过:string(byteArray[:])将[100]字节转换为字符串,则后面的0将显示为^@^@s。
在C语言中,字符串将在0处终止,那么在Go中将这个字节数组转换为字符串的最佳方法是什么?
我需要读取[100]字节来传输一堆字符串数据。
因为不是所有的字符串都恰好是100个字符长,所以字节数组的其余部分用0填充。
如果我通过:string(byteArray[:])将[100]字节转换为字符串,则后面的0将显示为^@^@s。
在C语言中,字符串将在0处终止,那么在Go中将这个字节数组转换为字符串的最佳方法是什么?
当前回答
当你不知道数组中非nil字节的确切长度时,你可以先修剪它:
字符串(字节。修剪(arr, “\x00”))
其他回答
简单的解决方案:
str := fmt.Sprintf("%s", byteArray)
但我不确定它的性能如何。
用这个:
bytes.NewBuffer(byteArray).String()
仅用于性能调优。
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))
}
Use:
s := string(byteArray[:])
虽然性能不是很好,但唯一可读的解决方案是:
// 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)
}
这将分配一个字节切片的切片。因此,如果它被大量或重复使用,请注意性能。