有没有一种有效的方法可以将固定 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/

10-11 21:58
查看更多