2017-05-15 6 views
0

私はフラットバッファを使用して、バイナリデータをUnixソケット経由で送信しています。私が送るflatbufferは動的な長さです。私が直面している問題は、1つのテーブルに対して何バイト読みなければならないかを知る方法です。ダイナミックFlatBuffersデリミタ

送信中に追加できる区切り記号のようなものがありますが、これを使ってフラットバッファの終わりを判断できます。私は小さいサイズ

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 
} 

答えて

1

FlatBuffersを読むの終わりを見つけることができないんだけどバッファの格納または転送の暗黙的な部分です。

バッファのサイズを知る方法がない場合、またはストリーミングバッファである場合は、32ビット長のフィールドを持つバッファを事前に修正するだけで済みます。データ。

これはC++ APIでも組み込まれています(SizePrefixed関数を参照)が、これはまだGoに移植されていないため、手動で行う必要があります。