Я пытаюсь написать в Linnux клиент на C++, используя boost::asio
данные из сокета. Сервер построен на Java. Проблема, с которой я столкнулся сейчас, заключается в том, что я не могу правильно прочитать некоторую информацию из сокета. Если клиент сделан на JAVA, все в порядке.
В деталях большая ошибка, которую я имею, заключается в получении unsigned long
и int
в структуре ниже. Я ожидаю, что значение для anInteger
должно быть 0x00000005
, поэтому 5, но чтение из сокета дает мне 0x03000
(?!?!). Это определенно другое число, и на основе шестнадцатеричной печати у меня меньше цифр (?!?!?).
Для aUnLong
я должен получить что-то приближающееся к числу 1279272977799, поэтому в шестнадцатеричном формате это 0x129DA9C8587
, вместо этого я получу что-то вроде 0x00129ffffffdaffffff8fffffff9f5c
. Я вижу, что какая-то часть информации хороша, но она перемешана со всеми ff
и откуда они берутся, я не знаю.
Я гарантированно получаю каждый раз 168 байт (так что фиксированное количество байтов). В начале я подумал о выравнивании данных в моей структуре, поэтому я представил attribute((packed))
.
label
и lbl_2
являются строкой; Теперь я знаю, что JAVA использует UTF, но мне непонятно, как это работает в этом сценарии.
Можете ли вы помочь мне с этой проблемой?
Большое спасибо.
EO
union MyStruct { char buffer[168]; struct _data{ char dash[2]; unsigned long aUnLong; char label[128]; char lbl_2[24]; int anInteger; } __attribute__((__packed__)); _data data; // the real data };
Чтение происходит с помощью этой простой строки
MyStruct obj; size_t reply_length = asio::read( s,asio::buffer(obj.buffer, 168));
это исходный формат, отправленный
byte 000,001: # byte 002-010: aLong (8 byte) long - milliseconds since 1-1-1970 in UTC byte 011-139: label (128 byte 2byte per character) label_1 byte 140-164: lbl2 (24 byte 2byte per character) label2 code byte 165-169: anInteger (4 byte) integer