【问题标题】:Copy byte array to Go struct accounting for struct padding将字节数组复制到 Go 结构占结构填充
【发布时间】:2016-12-09 02:58:56
【问题描述】:

假设我有这个 C 结构

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

Go 中的等价物:

type Foo struct {
    a uint8
    b uint32
}

我有一个包含 C 结构的字节片:

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

将这些数据放入 Go 结构(反之亦然)的最佳方法是什么。

请注意,我确实想要根据正常的 C 规则进行填充。 C 结构未打包

对于打包的结构,我可以这样做:

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

什么是等价物,考虑到填充?

【问题讨论】:

  • 不保证会有特定的填充。这显然与 C 无关。
  • 如果你不想打包你的结构,你必须序列化和反序列化。

标签: go struct padding


【解决方案1】:

啊,我意识到有一种相对简单的方法来做到这一点 - 只需将虚拟填充字节显式添加到 Go 结构中:

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

那么你可以使用binary.Read()

【讨论】:

  • [3]byte 需要 _,但这会失败。然后,它将是:type Foo struct { a uint8 _ [3]byte b uint32 } :-)
  • 哦,是的,这很奇怪。我阅读了有关匿名字段的信息,但没有意识到它们仅适用于非原始类型。
猜你喜欢
  • 2015-01-06
  • 1970-01-01
  • 2013-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多