为了账号安全,请及时绑定邮箱和手机立即绑定

如何通过 GO 中的编码包打包 C 位字段结构?

如何通过 GO 中的编码包打包 C 位字段结构?

Go
凤凰求蛊 2022-05-18 09:47:38
除了使用 cgo,你知道将 GO 对象打包到字节切片的最佳方法是什么吗?据我们所知,我们可以使用 encoding/binary 包将 GO 结构序列化为字节切片,但它仅支持固定长度变量,因此不支持以下情况。typedef struct{    uint32_t          foo:12;    uint32_t          bar:9;    uint32_t          baz:1;    uint32_t          qux:10;} type_t;对于这种情况,考虑到字节序,我们是否需要使用 getter/setter 来实现 GO 结构?如:type typeT struct{    fooBarBazQux uint32}// some complex bit manipulation considering endiannessfunc (t typeT) getFoo() uint32 {}func (t typeT) setFoo(val uint32) {}有没有更好的解决方案?我为我的自定义类型尝试了encoding/json mashaler,但 encoding/binary 包似乎不支持这种接口。我需要你的帮助。
查看完整描述

1 回答

?
小怪兽爱吃肉

TA贡献1852条经验 获得超1个赞

无法保证 C 中此类结构的实际打包和位顺序,并且即使在同一台机器上,也可能因编译器而异。1 如果位顺序确实很重要——就像在这种情况下一样——你可能应该编写自己的 setter 和 getter。

Go 确实内置了二进制编码操作,它可以让你访问二进制数据,即使它不是以本机机器顺序存储的。但是您可以对此类访问进行开放编码;它们并不是特别复杂。同样,为插入和访问做所有的位移和掩码并不,只是有点乏味。

Cgo 不支持位域访问。相关(但那里没有答案):如何在 Go 中访问 C 位域Go:位域和位打包(cgo 中不支持位域,也没有计划)。


1过去,在 680x0 上,当从 MIT C 编译器切换到 Sun 编译器时,这是一个问题,因为它们在字中使用不同的位顺序。当 68020 引入位域指令时,它们对位的编号与早期的单位测试指令不同,这助长了这种不兼容性。另请参阅较新的 68000 变体是否与较早的变体向后兼容?


查看完整回答
反对 回复 2022-05-18
  • 1 回答
  • 0 关注
  • 209 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信