gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 08:27:59 26 4
gpt4 key购买 nike

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

详细来说,我在接收 unsigned long 时遇到的大错误和 int在下面的结构中。我期待 anInteger 的值(value)应该是 0x00000005所以 5,但是从套接​​字读取给了我 0x03000 (?!?!)。它绝对是一个不同的数字,并且基于十六进制打印,我的数字更少(?!?!?)。

对于 aUnLong我应该收到接近数字 1279272977799 的东西,所以十六进制是 0x129DA9C8587 ,而是收到类似 0x00129ffffffdaffffff8fffffff9f5c 的内容.我看到有些信息很好,但它与所有 ff 混合在一起s 以及我不知道它们来自哪里。

我保证每次接收 168 个字节(如此固定的字节数)。一开始我考虑了我的结构的数据对齐,所以我介绍了 <strong>attribute</strong>((<strong>packed</strong>)) .

labellbl_2是字符串;我现在 JAVA 使用 UTF,但我不清楚它在这种情况下如何发挥作用。

你能帮我解决这个问题吗?

非常感谢。

教育 worker

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 UTCbyte 011-139: label (128 byte 2byte per character) label_1byte 140-164: lbl2 (24 byte 2byte per character) label2 codebyte 165-169: anInteger (4 byte) integer

最佳答案

您的结构在常见系统上似乎不是 168 字节。如果 long 是 4 个字节(在 32 位编译中是典型的),那么如果不支持 packed,那么您的结构可能是 162 或 164。如果 long 是 8 个字节,则为 164 或 168(如果填充,您认为这是错误的)。

检查程序中的 sizeof(_data) 并查看编译器告诉您的内容。

此外,您的原始格式信息令人困惑。例如,您说“字节 002-010:aLong(8 字节)长”,但字节 2-10 是九 (9) 个字节而不是 8 个字节。是否有 crc 或校验和字节?

关于c++ - 在 C++ 中读取由 Java + 结构对齐打开的套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3263625/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com