是否有有效的方法将固定字节切片转换为字符串而不向字符串添加空字符?
从字节切片转换字符串的传统方法如下:
out := string(b[STRIDX:STRIDX+STRLEN])
虽然这会返回一个字符串,但长度始终等于字节切片长度。因此,虽然字符串在Print
语句中看起来很正常,但它仍然引用了潜在的空值。如果您将字符附加到此字符串,这会产生一些非常奇怪的效果。
现在我扫描字节切片的空值,以限制我馈送到string
的字节切片。不是很漂亮或高效。
答案 0 :(得分:1)
写一个简单的函数:
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]