2017-05-15 2 views
0

Ich benutze flatbuffer, um Binärdaten über Unix-Socket zu senden. Der Flatbuffer, den ich sende, hat eine dynamische Länge. Das Problem, dem ich gegenüberstehe, ist, wie man weiß, wie viele Bytes ich für eine Tabelle lesen muss.Dynamic FlatBuffers Begrenzer

Gibt es so etwas wie ein Trennzeichen, das beim Senden angehängt werden kann, mit dem ich das Ende des Flatbuffers bestimmen kann.

Wenn ich mit einer kleineren Größe versuchte

buf := make([]byte, 512) 
    nr, err := c.Read(buf) 
    if err != nil { 
     fmt.Println("exit echo") 
     return 
    } 

Und wenn die flatbuffer, die größer als 512 Bytes ist gelesen wird, dann führt dies zu einem Versagen.

Wenn ich durch meine wachsenden Puffer lesen, dann bin ich nicht in der Lage, das Ende des

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

Antwort

1

FlatBuffers umfassen Feld eine Länge von Design nicht zu finden, da in den meisten Kontext der Länge eine ist impliziter Teil der Speicherung oder Übertragung eines Puffers.

Wenn Sie keine Möglichkeit haben, die Größe eines Puffers zu kennen, oder Sie Puffer streamen, ist das Beste, einfach einen Puffer mit einem 32-Bit-Längenfeld vorzufixieren, damit Sie den Rest des Puffers lesen können Daten.

In der C++ - API ist dies sogar eingebaut (siehe SizePrefixed Funktionen), aber dies wurde noch nicht nach Go portiert, also müssten Sie es manuell tun.