Go 动态缓冲区分隔符
我正在使用flatbuffer通过unix套接字发送二进制数据。我发送的flatbuffer是动态长度的。我面临的问题是,如何知道一个表需要读取多少字节 是否有类似于分隔符的东西可以在发送时追加,我可以使用它来确定flatbuffer的结尾 当我试着穿小一点的时候Go 动态缓冲区分隔符,go,flatbuffers,Go,Flatbuffers,我正在使用flatbuffer通过unix套接字发送二进制数据。我发送的flatbuffer是动态长度的。我面临的问题是,如何知道一个表需要读取多少字节 是否有类似于分隔符的东西可以在发送时追加,我可以使用它来确定flatbuffer的结尾 当我试着穿小一点的时候 buf := make([]byte, 512) nr, err := c.Read(buf) if err != nil { fmt.Println("exit echo")
buf := make([]byte, 512)
nr, err := c.Read(buf)
if err != nil {
fmt.Println("exit echo")
return
}
如果读取大于512字节的flatbuffer,则会导致失败
当我通过增加缓冲区进行读取时,我无法找到读取的结尾
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
}
FlatBuffers在设计上不包括长度字段,因为在大多数上下文中,长度是缓冲区存储或传输的隐式部分 如果您无法知道缓冲区的大小,或者您是流式缓冲区,最好是简单地使用32位长度字段预先修复任何缓冲区,以便您可以使用该字段读取其余数据
在C++ API中,这甚至是内置的,参见sieEpPixFor函数,但这还没有被移植到现在,所以您必须手动完成。