Разложение структуры по байтам

#go

#Вперед

Вопрос:

Я не могу найти способ компоновки структуры для программирования массива байтов с помощью GO. Я программирую расширение для сервиса GoBGP. Я хочу настроить сообщество для маршрута через GoBGP API. Подробнее о BGP и сообществах.

Моя ситуация:

Я пытаюсь отправить 32-битное число. Во-первых, 16 бит интерпретируются как число, остальные 16 бит — сообщества. API имеет интерфейс для uint32 для установки всех этих данных. Я хочу иметь простую структуру, подобную:

 type routeCommunity struct {
   AS        uint16
   Community uint16
}
  

Я изо всех сил пытаюсь передать эти структурные данные в переменную uint32. Я хотел бы преобразовать ее в массив байтов, а затем я мог бы просто создать из нее uint32.

В C у меня был бы указатель структуры, указывающий на массив символов, и я продолжал бы работать с этой структурой, и, в конце концов, я бы отправил массив символов.

Как это сделать в Golang??

Ответ №1:

Вы можете передать свою структуру в переменную uint32, используя «небезопасный» пакет:

 func (rc *routeCommunity) bits() uint32 {
    return *(*uint32)(unsafe.Pointer(rc))
}
  

https://play.golang.org/p/AQeeoYUn7o0

UPD:

Имейте в виду, что расположение битов зависит от порядка расположения полей структуры. Два младших байта переменной содержат первое значение поля, а два старших байта содержат второе.

Комментарии:

1. Это действительно помогло, но есть проблема. Поля находятся в смешанном положении. Возможно ли изменить порядок размещения полей в памяти? 16 бит должны быть первыми, но теперь биты AS находятся в конце. Ситуация выглядит следующим образом: Сообщество / AS вместо AS / Community

2. @gedO Я обновил свой ответ. Пожалуйста, проверьте это.