Как упаковать структуру поля C бит через пакет кодирования в GO? - PullRequest
1 голос
/ 12 февраля 2020

Кроме использования cgo, знаете ли вы, как лучше всего упаковать объект GO в байтовый фрагмент?

Мы можем использовать кодирование / двоичный пакет для сериализации GO struct до байтового среза, насколько нам известно, но он поддерживает только переменную фиксированной длины, поэтому не может поддерживать следующий случай.

typedef struct
{
    uint32_t          foo:12;
    uint32_t          bar:9;
    uint32_t          baz:1;
    uint32_t          qux:10;
} type_t;

Нужно ли нам реализовать GO структуру с getter / setter для этого случая с ужасным битом манипуляция с учетом порядка байтов? Например:

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 для моего пользовательского типа, но пакет кодирования / двоичного кода делает Кажется, не поддерживается такой интерфейс.

Мне нужна ваша помощь.

1 Ответ

0 голосов
/ 12 февраля 2020

Фактическая упаковка и порядок битов таких структур в C не гарантируется и может варьироваться от одного компилятора к другому, даже на одном и том же компьютере. 1 Если порядок бит действительно имеет значение - как и в этом случае - вам, вероятно, следует написать свои собственные методы установки и получения.

Go имеет встроенные операции двоичного кодирования , которые могут позволить вам получить доступ к двоичным данным, даже если они не хранится в машинном порядке. Но вы можете открыть такой доступ; они не особенно сложны. Точно так же выполнение всего сдвига и маскирования битов для вставки и доступа не является сложным , это просто немного утомительно.

Cgo не поддерживает доступ к битовым полям. Связано (но ответа нет): Как получить доступ к C битовому полю в Go; Go: битовые поля и битовая упаковка (нет поддержки битовых полей в cgo и не планируется).


1 Назад в В тот день, на 680x0, это было проблемой при переключении с компилятора MIT C на Sun, так как они использовали разные битовые порядки в словах. Когда 68020 ввел команды битового поля, они пронумеровали биты не так, как в предыдущих однобитовых тестовых инструкциях, что способствовало возникновению этой несовместимости. См. Также . Совместимы ли более поздние версии 68000 с предыдущими?

...