在C ++中读取由Java +结构对齐打开的套接字

我正尝试在Linnux中使用来自套接字的boost::asio数据在C ++中编写客户端。 该服务器是用Java构建的。 我现在的问题是我无法正确地从套接字读取一些信息。 如果客户端是用JAVA完成的,一切都可以。

详细来说,我在接收unsigned longint结构时unsigned long了很大的错误。 我expectng一个值anInteger0x00000005所以5,但是从插座读给我0x03000 (?!?!)。 它定义了一个不同的数字,并且基于十六进制打印,我有更少的数字(?!?!?)。

对于aUnLong我应该收到一些接近1279272977799的数字,因此在十六进制中是0x129DA9C8587 ,而不是像0x00129ffffffdaffffff8fffffff9f5c那样接收0x00129ffffffdaffffff8fffffff9f5c 。 我发现一些信息很好,但它与所有ff混合在一起,我不知道它们来自哪里。

我保证每次接收168字节(如此固定的字节数)。 在一开始我虽然关于我的结构的数据对齐,所以我介绍了attribute (( packed ))

labellbl_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

下一篇: What's a portable way of converting Byte