2016-08-03 96 views
1

假設我有這個C結構複製字節數組去結構佔比結構填充

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

及其等價圍棋:

type Foo struct { 
    a uint8 
    b uint32 
} 

而且我有一個包含C結構字節片:

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

什麼是最好的方式來獲取數據到Go結構(反之亦然)。

請注意,I 確實希望根據正常的C規則填充。 C結構是不包裝

對於包裝的結構,我可以做這樣的事情:

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

什麼是等價的,同時填充進去?

+0

不保證會有一個特定的填充。這顯然與C無關。 – Olaf

+1

如果您不想打包結構,則必須序列化並反序列化。 – LPs

回答

1

啊,我意識到有一個比較簡單的方法來做到這一點 - 只是明確添加僞填充字節成細末結構:

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

然後你可以使用binary.Read()

+0

'[3] byte'需要'_',但是會失敗。然後,這將是:'Foo類型結構{ \t一個UINT8 \t _ [3]字節 \t b UINT32 }':-) –

+0

噢這是很奇怪。我閱讀了匿名字段,但沒有意識到他們只適用於非主要類型。 – Timmmm