簡體   English   中英

如何通過GO中的編碼包來打包C位域結構?

[英]How to pack the C bit field struct via encoding package in GO?

除了使用 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 endianness
func (t typeT) getFoo() uint32 {
}
func (t typeT) setFoo(val uint32) {
}

有沒有更好的解決方案?

我為我的自定義類型嘗試了encoding/json mashaler ,但 encoding/binary 包似乎不支持這種接口。

我需要你的幫助。

C 中此類結構的實際打包和位順序無法保證,並且可能因編譯器而異,即使在同一台機器上也是如此。 1如果位順序真的很重要——就像在這種情況下一樣——你可能應該編寫自己的 setter 和 getter。

Go 確實內置了二進制編碼操作,它可以讓您訪問二進制數據,即使它不是按本機機器順序存儲的。 但是您可以對此類訪問進行開放編碼; 它們並不是特別復雜。 同樣,為插入和訪問做所有的位移和掩碼並不困難,只是有點乏味。

Cgo 不支持位域訪問。 相關(但沒有答案): How to access C bitfield in Go Go:位域和位打包(在 cgo 中不支持位域,也沒有計划)。


1過去,在 680x0 上,當從 MIT C 編譯器切換到 Sun 編譯器時,這是一個問題,因為它們在字內使用不同的位順序。 當 68020 引入位域指令時,它們的位編號與早期的單位測試指令不同,這在某種程度上助長了這種不兼容性。 另請參閱以后的 68000 變體是否與早期的變體向后兼容?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM