В C/C++ обычно вы бы просто написать struct
с различными членами в правильном порядке (правильная упаковка может потребовать компилятор конкретных прагм) и свалки/прочитать в/из файла с сырым fwrite
/fread
(или read
/write
при работе с потоками C++). Фактически, pack
и unpack
были рождены для чтения материалов, сгенерированных с помощью этого метода.
Если вам нужен результат в буфере вместо файла, это еще проще, просто скопируйте структуру в буфер с помощью memcpy
.
Если представление должно быть портативным, ваши основные проблемы - это порядок байтов и упаковка полей; первая проблема может быть решена с помощью различных функций hton*
, а вторая - с директивами, специфичными для компилятора.
В частности, многие компиляторы поддерживают #pragma pack
директиву (см here для VC++, here для GCC), что позволяет управлять (ненужными) отступами, что компилятор может вставить в struct
иметь его поля выравниваются на удобных границах ,
Имейте в виду, однако, что на некоторых архитектурах не допускается доступ к полям конкретных типов, если они не выровнены по их естественным границам, поэтому в этих случаях вам, вероятно, потребуется сделать какое-то руководство memcpy
s, чтобы скопировать необработанные байты для переменных, которые правильно выровнены.
Не могли бы вы объяснить, что 'pack' /' unpack' делать на этих языках? – Mehrdad
Пакет и распаковка используются для превращения переменных в двоичную строку и наоборот. Они очень полезны для создания пакетов и двоичных файлов и других бинарных взаимодействий. Языки, о которых я упоминал, имеют эту функцию в их стандартной библиотеке.C/C++ - нет. – Linuxios
О хм ... FYI, это может быть даже невозможно. Это потребует большого количества метапрограммирования (или поддержки IDE), чтобы получить всю информацию о поле и такой ... единственный родной язык, который я знаю, который, вероятно, мог бы сделать это, - [D] (http://dlang.org/). – Mehrdad