В C / C ++ обычно вы просто пишете struct
с различными членами в правильном порядке (для правильной упаковки могут потребоваться специфичные для компилятора прагмы) и выгружаете / считываете его в / из файла с необработанным fwrite
/ fread
(или read
/ write
при работе с потоками C ++). На самом деле pack
и unpack
были рождены, чтобы читать вещи, сгенерированные этим методом.
Если вам вместо этого нужен результат в буфере, а не в файле, это еще проще, просто скопируйте структуру в буфер с помощью memcpy
.
Если представление должно быть переносимым, ваши основные проблемы - это порядок байтов и упаковка полей; Первая проблема может быть решена с помощью различных функций hton*
, а вторая - с директивами, специфичными для компилятора.
В частности, многие компиляторы поддерживают директиву #pragma pack
(см. здесь для VC ++, здесь для gcc), которая позволяет вам управлять (нежелательным) заполнением, которое компилятор можно вставить в struct
, чтобы его поля были выровнены по удобным границам.
Имейте в виду, однако, что на некоторых архитектурах не разрешен доступ к полям определенных типов, если они не выровнены по своим естественным границам, поэтому в этих случаях вам, вероятно, потребуется выполнить некоторые memcpy
инструкции для копирования необработанные байты для переменных, которые правильно выровнены.