我需要读取[100]字节来传输一堆字符串数据。

因为不是所有的字符串都恰好是100个字符长,所以字节数组的其余部分用0填充。

如果我通过:string(byteArray[:])将[100]字节转换为字符串,则后面的0将显示为^@^@s。

在C语言中,字符串将在0处终止,那么在Go中将这个字节数组转换为字符串的最佳方法是什么?


当前回答

当你不知道数组中非nil字节的确切长度时,你可以先修剪它:

字符串(字节。修剪(arr, “\x00”))

其他回答

虽然性能不是很好,但唯一可读的解决方案是:

  // 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)
}

这将分配一个字节切片的切片。因此,如果它被大量或重复使用,请注意性能。

当你不知道数组中非nil字节的确切长度时,你可以先修剪它:

字符串(字节。修剪(arr, “\x00”))

读取时使用片而不是数组。例如,io。Reader接受片,而不是数组。 使用切片代替零填充。

例子:

buf := make([]byte, 100)
n, err := myReader.Read(buf)
if n == 0 && err != nil {
    log.Fatal(err)
}

consume(buf[:n]) // consume() will see an exact (not padded) slice of read data

下面是一个删除空字节的选项:

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

例如,

package main

import "fmt"

func CToGoString(c []byte) string {
    n := -1
    for i, b := range c {
        if b == 0 {
            break
        }
        n = i
    }
    return string(c[:n+1])
}

func main() {
    c := [100]byte{'a', 'b', 'c'}
    fmt.Println("C: ", len(c), c[:4])
    g := CToGoString(c[:])
    fmt.Println("Go:", len(g), g)
}

输出:

C:  100 [97 98 99 0]
Go: 3 abc