Go 动态缓冲区分隔符

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")

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

是否有类似于分隔符的东西可以在发送时追加,我可以使用它来确定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
}

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

如果您无法知道缓冲区的大小,或者您是流式缓冲区,最好是简单地使用32位长度字段预先修复任何缓冲区,以便您可以使用该字段读取其余数据

在C++ API中,这甚至是内置的,参见sieEpPixFor函数,但这还没有被移植到现在,所以您必须手动完成。