Сериализация значений Int в буфер char* в ANSI C

Я попытался сериализовать поле структуры (int) в буфер char*, но думаю, что делаю что-то неправильно.

Это то, что я использую для копирования этого поля.

memcpy(payload + offset, &packet->payload.offset, sizeof(long int));

package->payload.offset представляет собой длинное целое число и содержит значение «5» (жестко запрограммированное), обратите внимание, что:

Если я напечатаю: printf("offset: %ld \n", packet->payload.offset);, я получу: offset: 5

Но если я напечатаю: printf("offset: %ld \n",&packet->payload.offset), я получу: offset: 167120959

Если в memcopy я удалю «&» во втором аргументе, чтобы записать «5» в буфер, это вызовет ошибку сегментации, но если я этого не сделаю, он скопирует 167120959 (я полагаю, что это его адрес) в буфер вместо фактическое значение.

Большое спасибо за Вашу помощь! Я старался быть как можно более описательным, надеюсь, вы сможете мне помочь.


person Guillermo Gruschka    schedule 20.05.2012    source источник


Ответы (2)


Но если я напечатаю: printf("offset: %ld \n",&packet->payload.offset), я получу: offset: 167120959

Это потому, что вы печатаете адрес, а не значение. Ваш метод «сериализации» в порядке (кроме порядка байтов), потому что memcpy ожидает адреса.

Я удаляю «&» во втором аргументе, чтобы записать «5» в буфер [...], но если я этого не сделаю, он копирует 167120959 (я полагаю, что это его адрес) в буфер вместо фактического значения .

Неправильный. Он копирует sizeof(long int) байта с этого адреса.

person cnicutar    schedule 20.05.2012
comment
Это то, что я ожидал, но когда я десериализую поток и печатаю пакет-›payload.offset, я получаю 167120959, когда я должен был получить 5 - person Guillermo Gruschka; 20.05.2012

But if I print: printf("offset: %ld \n",&packet->payload.offset), I get: offset: 167120959

Это неправильно, он печатает адрес packet->payload.offset вместо самого packet->payload.offset.

В Memcpy должен быть указан адрес переменной, иначе он не сможет ее изменить (в C нет передачи параметра byref). Таким образом, вы передаете memcpy() адрес переменной, но printf() нужно только прочитать его, поэтому вы можете (и должны) передавать переменную напрямую.

person Community    schedule 20.05.2012
comment
понял вашу точку зрения, но как мне записать содержимое переменной в char* ? - person Guillermo Gruschka; 20.05.2012
comment
char *buf = (куда бы он ни указывал); *(int *)buf = package-›payload.offset; - person ; 20.05.2012
comment
Могу ли я использовать memcpy() для этого? - person Guillermo Gruschka; 20.05.2012
comment
вы можете, но тогда это тот же (хороший) метод, который вы использовали - тогда почему вы спрашиваете? - person ; 21.05.2012
comment
спасибо за ответ :) Потому что, когда я использую memcopy, как подробно описано в моем вопросе, memcopy записывает адрес в char* вместо содержимого переменной. - person Guillermo Gruschka; 21.05.2012