Как послать структуру с обитыми областями?

У меня есть 12-байтовый пакет, который пошлют формы:

+--------+------+
| ID     | ver  |
+--------+------+

ID составляет 8 байтов, и ver составляет 4 байта. Я объявил структуру как ниже, но мой PC дает мне стоимость размера 16 байтов (8 + 4 + 4 байта дополнения). #pragma решил проблему, но является там каким-либо способом решить проблему?

struct pak
{
  char *ID;
  uint32_t ver;
};
1
nl ja de
Вы сказали, что #pragma решил проблему.. Тогда, что там, чтобы решить?
добавлено автор Krishnabhadra, источник
Право @lbonn, но я предлагаю случайную работу [8] - так как указатель будет бесполезен независимо цели machinge размер указателя:-),
добавлено автор Mario The Spoon, источник
@foo_l не, #pragma пакет является единственным путем
добавлено автор Mario The Spoon, источник
Кто-либо еще удаленно взволнованный тем, что структура he' s собирающийся послать (упакованный или не) содержит случайную работу* указатель и не байты, на которые он ссылается там?
добавлено автор WhozCraig, источник
Что там, чтобы "решить" в этом пункте?
добавлено автор Sean Bright, источник
Кроме того, на другой машине, обугливаются* , может иметь различный размер. Возможно, необходимо использовать uint64_t в этом случае.
добавлено автор lbonn, источник
Размер обугливается*, ID составляет 4 байта, почему вы считаете его как 8 ?
добавлено автор Adeel Ahmed, источник
имейте вас попробованный как это, uint32_t ver __ признак __ ((упакованный));
добавлено автор Adeel Ahmed, источник
Я имею в виду, есть ли какой-либо другой способ постараться не дополнять. Спасибо
добавлено автор foo_l, источник
@WhozCraig да, я думаю, что это - проблема.. таким образом согласно Марио я должен изменить его случайная работа [8].
добавлено автор foo_l, источник

3 ответы

Самое универсальное, портативное и защищенное от ошибки решение состоит в том, чтобы сделать не, заботятся о дополнении вообще.

Вместо того, чтобы послать структуру, как это, можно преобразовать в последовательную форму и десериализовать структуру к использованию множества характера, например, memcpy .

You should not forget about the endianness when sending data to the other device - see documentation for ntohl and ntohs for details.

5
добавлено
@foo_l Один простой путь должен сделать союз структуры и множества байтов.
добавлено автор PhiLho, источник
@foo_l, Когда я написал "использование, например memcpy ", я хотел звонить memcpy (&buffer [0], val, sizeof (val)); , где val область структуры и , буфер является множеством, достаточно большим, чтобы содержать структуру. Для областей вы увеличиваете индекс в &buffer [0] sizeof (val) .
добавлено автор Rafał Rawicki, источник
I' m жаль, как преобразовать в последовательную форму и desrialize структура? Можно ли, пожалуйста, дать пример. Спасибо
добавлено автор foo_l, источник
struct pak
{
  char *ID;
  uint32_t ver;
}__attribute__((packed));

Не используйте выше ни для какого дополнительного дополнения..

0
добавлено

похож на вашу платформу, выравнивают структуру на 8-байтовой границе. у gcc есть выбор изменить это. если вы хотите упаковать вещи на 4-байтовой границе, собирают с-fpack-struct=4 позволенным выбором. но будьте осторожны, это может замедлить выделение памяти. (поскольку больше детали видит gcc руководство),

Если вы не пишете код иждивенца платформы вместо того, чтобы использовать указатель случайной работы, можно пойти для uint64_t. Помните, 32-битная платформа даст вам 4-байтовую подсказку.

0
добавлено