我使用flatbuffer通过unix socket发送二进制数据。我发送的扁平缓冲器具有动态长度。我面临的问题是,如何知道我必须为一个表读取多少字节。
是否有类似分隔符的东西可以在发送时附加,我可以用它来确定扁平缓冲区的结束。
当我尝试使用较小的尺寸时
buf := make([]byte, 512)
nr, err := c.Read(buf)
if err != nil {
fmt.Println("exit echo")
return
}
如果读取大于512字节的扁平缓冲区,则会导致失败。
当我通过增长缓冲区来阅读时,我无法找到阅读的结尾
var n, nr int
var err error
buf := make([]byte, 0, 4096) // big buffer
tmp := make([]byte, 512)
for {
n, err = c.Read(tmp)
if err != nil {
break
}
nr += n
if nr >= 4096 {
err = errOverrun
break
}
buf = append(buf, tmp[:n]...)
}
if err != nil {
fmt.Println("read error:", err)
break
}
答案 0 :(得分:1)
FlatBuffers在设计中不包含长度字段,因为在大多数情况下,长度是缓冲区存储或传输的隐含部分。
如果你无法知道缓冲区的大小,或者你是流缓冲区,最好是简单地预先修复任何具有32位长度字段的缓冲区,这样你就可以用它来读取其余的数据
在C ++ API中,这甚至是内置的(参见SizePrefixed
函数),但是还没有移植到Go,所以你必须手动完成。