2016-08-03 84 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