Запись структуры в буфер - PullRequest
0 голосов
/ 29 июня 2018

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

#include <packet.h>
#include <stdio.h>
#include <string.h>
#include <stdint.h>


typedef struct
{
        int A;
        int B;
        int C;
}test_packet;

int main(int argc, char** argv)
{
        test_packet p;
        p.A = 1;
        p.B = 2;
        p.C = 3;

        char buffer [sizeof(p)];
        memcpy(buffer, &p, sizeof(p));
        printf("%x \n", buffer);

        return 0;
}

Однако, когда я запускаю этот код, так как сериализуемая структура статически кодируется, я ожидаю, что буфер будет одинаковым каждый раз. Я не вижу буфер, заполненный случайными данными:

./SerializePacket
41bf5380
./SerializePacket
d89fc790
./SerializePacket
aea2c00
./SerializePacket
d355dc10

Может ли кто-нибудь облегчить мне мое невежество здесь?

1 Ответ

0 голосов
/ 29 июня 2018

То, что вы печатаете, является указателем, адресом буфера.

О сериализации: вы копируете структуру в буфер, с отступом и все . Это не переносимо, если вы не сериализовали и не сериализовали на одном компьютере. Чтобы сериализовать структуру, непосредственно копирующую в буфер, вы должны использовать упакованные структуры (см .: Что такое "упакованная" структура в C? , https://en.wikipedia.org/wiki/Data_structure_alignment). Также использование целого числа фиксированного размера предпочтительнее для сериализованных данных, например, uint16_t для 16-разрядного целого числа без знака.

...