0

我正在使用 flatbuffer 通过 unix 套接字发送二进制数据。我发送的 flatbuffer 是动态长度的。我面临的问题是,如何知道我必须为一张表读取多少字节。

发送时是否可以附加分隔符之类的东西,我可以用它来确定平面缓冲区的结尾。

当我尝试使用较小的尺寸时

    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
}
4

1 回答 1

1

FlatBuffers 在设计上不包括长度字段,因为在大多数情况下,长度是缓冲区存储或传输的隐含部分。

如果您无法知道缓冲区的大小,或者您正在流式传输缓冲区,那么最好的方法是简单地为任何缓冲区添加一个 32 位长度字段的前缀,这样您就可以使用它来读取其余数据。

在 C++ API 中,它甚至是内置的(参见SizePrefixed函数),但尚未移植到 Go,因此您必须手动完成。

于 2017-05-15T16:25:58.253 回答