在C ++中读取由Java +结构对齐打开的套接字
我正尝试在Linnux中使用来自套接字的boost::asio
数据在C ++中编写客户端。 该服务器是用Java构建的。 我现在的问题是我无法正确地从套接字读取一些信息。 如果客户端是用JAVA完成的,一切都可以。
详细来说,我在接收unsigned long
和int
结构时unsigned long
了很大的错误。 我expectng一个值anInteger
应0x00000005
所以5,但是从插座读给我0x03000
(?!?!)。 它定义了一个不同的数字,并且基于十六进制打印,我有更少的数字(?!?!?)。
对于aUnLong
我应该收到一些接近1279272977799的数字,因此在十六进制中是0x129DA9C8587
,而不是像0x00129ffffffdaffffff8fffffff9f5c
那样接收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
您的结构在普通系统上看起来不是168字节。 如果long
是4字节(在32位编译中是典型的),那么你的结构可能是162或164,如果包装不符合。 如果long
是8个字节,那么164或168(如果填充,那么你猜测是不好的)。
检查程序中的sizeof(_data)
,看看编译器告诉你它是什么。
此外,您的原始格式信息令人困惑。 例如你说“字节002-010:a长(8字节)长”,但字节2-10是9字节而不是8字节。是否有crc或校验和字节?
链接地址: http://www.djcxy.com/p/61897.html上一篇: reading in C++ a socket open by Java + structure alignment