Я создаю систему сообщений на основе кафки, которая должна сбрасывать в кафке сложную структуру C. Для начала я пытаюсь сделать что-то простое, создав простую структуру и отправить его:Отправить двоичную структуру кафке с помощью C
struct Points {
int x,y;
} points;
struct Points p;
p.x=0;
p.y=0;
size_t len = sizeof(p);
В производителе:
rd_kafka_produce(rkt, partition,RD_KAFKA_MSG_F_COPY,&p, len,NULL, 0,NULL)
В потребителя я определяю ту же структуру, но я использую:
rkmessage = rd_kafka_consume(rkt, partition, 1000);
struct Points* p2=(struct Points*)&(rkmessage->payload);
printf("Struct p: %d %d\n\n",p2->x,p2->y);
Но он печатает мусор.
I, J, были 1,1
% Сообщение (смещение 0, 8 байт):
Полезная нагрузка Сообщение шестнадцатеричного (8 байт):
00000000: 01 00 00 00 01 00 00 00
Struct р: -469758844 32530
I, J были 256,256
% Сообщение (смещение 1, 8 байт):
Полезная нагрузка Сообщение шестнадцатеричного (8 байт):
00000000: 00 80 00 00 80 00 00 00
Struct р: -469758810 32530
I, J были 4294967295 (макс целое), 4294967295 (макс целое)
% Messa GE (смещение 2, 8 байт):
Payload Сообщение шестнадцатеричного (8 байт):
00000000: FF FF FF FF FF FF FF FF
Struct р: -469758776 32530
I, J были 0,0
% сообщения (смещение 3, 8 байт):
Сообщи е Payload шестнадцатеричного (8 байт):
00000000: 00 00 00 00 00 00 00 00
Struct р: -469758742 32530
Как правильно сбросить и получить структуру? Я знаю, что могу сериализовать данные, но в будущем мне придется отправлять гораздо более сложную непрозрачную структуру. Более того, путем сериализации я могу использовать гораздо больше памяти.
Благодаря
Фактически, «полезная нагрузка» является '(void *)', поэтому это имеет смысл. – dubafek
правый. Полезная нагрузка - это указатель на пустоту, поэтому требуется указатель структуры. Читая данные, напечатанные с помощью hexdump, ясно, что данные сохранены правильно. Например, 01 00 00 00 01 00 00 00 = 1, 1. Но p: -469758844 32530 вместо этого выглядит скорее как адрес. Действительно, читая значение один за другим, только первая часть меняет –
@ Сильвестро. Не могли бы вы уточнить, что вы получаете, когда печатаете 'struct p' после внесения вышеуказанного изменения? – vmachan