2016-08-03 20 views
1

Angenommen, ich habe diese C structCopy Bytedatenfeld struct to Go für struct padding accounting

struct Foo 
{ 
    uint8_t a; 
    // 3 bytes of padding 
    uint32_t b; 
} 

und sein Äquivalent in Go:

type Foo struct { 
    a uint8 
    b uint32 
} 

Und I ein Byte Scheibe haben, die das C struct enthält :

data := []byte { 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04 } 

Was ist der beste Weg, um diese Daten in die Go-Struktur (und umgekehrt) zu bekommen.

Beachten Sie, dass ich Padding gemäß den normalen C-Regeln wollen. Die C-Struktur ist nicht gepackt.

Für verpackte structs ich so etwas tun könnte:

data := []byte { 0x01, 0x01, 0x02, 0x03, 0x04 } 
    f := Foo{} 
    buf := bytes.NewBuffer(data) 
    err := binary.Read(buf, binary.LittleEndian, &f) 

Was das Äquivalent ist, padding berücksichtigt?

+0

Es gibt keine Garantie, es verwenden wird eine bestimmte Auffüllung. Und das hängt offenbar nicht mit C. zusammen. – Olaf

+1

Sie müssen serialisieren und deserialisieren, wenn Sie Ihre Strukturen nicht packen wollen. – LPs

Antwort

1

Ah ich erkannte es eine relativ einfache Art und Weise ist, es zu tun - nur explizit Dummy Paddingbytes in die Struktur Go hinzufügen:

type Foo struct { 
    a uint8 
    _ [3]byte 
    b uint32 
} 

Dann können Sie binary.Read()

+0

'[3] Byte' benötigt' _', aber das wird fehlschlagen. Dann wäre es: 'Typ Foo struct { \t ein uint8 \t _ [3] Byte \t b Uint32 }' :-) –

+0

Oh ja, das ist seltsam. Ich habe über anonyme Felder gelesen, habe aber nicht erkannt, dass sie nur für nicht-primative Typen funktionieren. – Timmmm