我需要阅读[100]byte
以传输一堆string
数据.
因为不是所有的string
s都是100个字符长,所以剩下的部分byte array
用0
s 填充.
如果我[100]byte
转向string
:string(byteArray[:])
,拖尾0
s显示为^@^@
s.
在C string
将在终止0
,所以我不知道什么的巧妙的最佳方式转移byte array
到string
在Golang.
Dan*_*iel 487
将数据读入字节片的方法返回读取的字节数.您应该保存该号码,然后使用它来创建您的字符串. n
作为读取的字节数,您的代码将如下所示:
s := string(byteArray[:n])
Run Code Online (Sandbox Code Playgroud)
如果由于某种原因你没有n
,你可以使用bytes包来找到它,假设你的输入中没有空字符.
n := bytes.Index(byteArray, []byte{0})
Run Code Online (Sandbox Code Playgroud)
或者正如icza指出的那样,您可以使用以下代码:
n := bytes.IndexByte(byteArray, 0)
Run Code Online (Sandbox Code Playgroud)
mat*_*tes 369
关于什么?
s := string(byteArray[:])
Run Code Online (Sandbox Code Playgroud)
小智 62
简单的解决方案:
str := fmt.Sprintf("%s", byteArray)
Run Code Online (Sandbox Code Playgroud)
我不确定这是多么高效.
pet*_*rSO 14
例如,
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)
}
Run Code Online (Sandbox Code Playgroud)
输出:
C: 100 [97 98 99 0]
Go: 3 abc
Run Code Online (Sandbox Code Playgroud)
下面的代码正在寻找'\ 0',并且在问题的假设下,数组可以被认为是排序的,因为所有非'\ 0'都在'\ 0'之前.如果数组在数据中包含'\ 0',则该假设将不成立.
使用二进制搜索找到第一个零字节的位置,然后切片.
你可以找到像这样的零字节:
package main
import "fmt"
func FirstZero(b []byte) int {
min, max := 0, len(b)
for {
if min + 1 == max { return max }
mid := (min + max) / 2
if b[mid] == '\000' {
max = mid
} else {
min = mid
}
}
return len(b)
}
func main() {
b := []byte{1, 2, 3, 0, 0, 0}
fmt.Println(FirstZero(b))
}
Run Code Online (Sandbox Code Playgroud)
只是天真地扫描字节数组寻找零字节可能更快,特别是如果你的大多数字符串都很短.
归档时间: |
|
查看次数: |
464024 次 |
最近记录: |