有没有一种有效的方法可以将固定 byte slice 转换为字符串,而无需在字符串中添加空字符?
从 byte slice 转换字符串的传统方法如下:
out := string(b[STRIDX:STRIDX+STRLEN])
尽管此操作返回一个字符串,但其长度始终等于 byte slice 的长度。因此,尽管该字符串在
Print
语句上看起来很正常,但仍在引用电位为null的值。现在,我扫描 byte slice 中是否有空值,以将输入的 byte slice 限制为
string
。不是很漂亮或没有效率。示例:https://play.golang.org/p/hOoaqCOoFl0
最佳答案
编写一个简单的函数:
func CToGoString(b []byte) string {
i := bytes.IndexByte(b, 0)
if i < 0 {
i = len(b)
}
return string(b[:i])
}
例如,
package main
import (
"bytes"
"fmt"
)
func CToGoString(b []byte) string {
i := bytes.IndexByte(b, 0)
if i < 0 {
i = len(b)
}
return string(b[:i])
}
const (
BUFLEN = 50
STRLEN = 10
STRIDX = 10
)
func main() {
test := "test"
b := [BUFLEN]byte{}
fmt.Printf("Original\n\tString: '%+v' with length '%d'\n", test, len(test))
copy(b[10:], []byte(test))
s := CToGoString(b[STRIDX : STRIDX+STRLEN])
fmt.Printf("Unpacking with []byte()\n\tString: '%+v' with length '%d' Buf:%+v\n", s, len(s), []byte(s))
}
游乐场:https://play.golang.org/p/mH3CBdM6eG_l
输出:
Original
String: 'test' with length '4'
Unpacking with []byte()
String: 'test' with length '4' Buf:[116 101 115 116]
关于string - 固定字节 slice 到字符串的转换-忽略null,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48833106/