发生铸造时的字节跳过
Byte skipping when casting occurs
我有一个看起来像这样的结构
struct message_header
{
unsigned long msg_num : 32; //0-3 message id
unsigned long msg_len : 32; //4-7 message length
unsigned long hardware_version : 16; //8-9 hardware version
unsigned long sender_location : 32 //10-13 location
unsigned long message; //14 ... messages
};
message_header * msg_ptr;
从recvfrom
函数接收字符阵列(recvbuf
(后,我会做 reinterpret_cast
,
msg_ptr = reinterpret_cast<message_header*>(recvbuf)
但是,在我的模拟器(来自Linux,VM(发送数据之后,我的接收器(结构在接收器中((在Windows上(,输出数据不计算。
假设来自模拟器发送的数据为:
msg num : 1010
msg len : 20
hardware version: 1
location: 25
messages: //rest of the bytes
Wireshark的数据包显示:
00 00 03 F2
00 00 00 14
00 01 00 00
00 19 00 00
...
输出打印是:
msg num : 1010
msg len : 20
hardware version: 1
location: 1638400
经过大量调试后,我注意到在演员阵容,硬件版本之后,丢弃或跳过01
之后的00 00
,我不确定我找不到哪种方法来确定它,以及下一个00 19 00 00
的4个字节被施加到我的sender_location
中。
发件人的所有消息类型和长度都是在发件人的设计规范上构建基础,并且发件人上的hardware version
是unsigned short
。
我已经阅读了以下问题和答案
在结构跳过字节中的字段
#pragma pack效果
我尝试过,但无济于事,请建议。
构件的比对将位于n的倍数或成员大小的倍数上,以较小者为准。
我一开始不明白这意味着什么,直到我一遍又一遍地重新阅读,我意识到我的hardware version
正在使用4 bytes
的long
,而不是我应该使用2 bytes
的short
,而是另一个问题来了在想到,这就是为什么比特菲尔德限制不起作用,或者我可能错误地理解它。
因此,在将其从long
更改为short
之后,并且使用#pragma pack(1)
,Cast现在可以正常工作。
以及我如何发现offsetof
功能检查
cout << offsetof (message_header, msg_num) << endl;
cout << offsetof (message_header, msg_len) << endl;
cout << offsetof (message_header, hardware_version) << endl;
cout << offsetof (message_header, sender_location ) << endl;
cout << offsetof (message_header, message) << endl;
打印输出是,然后我意识到比特菲尔德根本没有工作。
0
4
8
12
16
将hardware_version
更改为long
到short
,并且没有#pragma pack(1)
,打印输出仍然与上述一个相似,但是,一旦启用了#pragma pack(1)
,则打印输出,打印输出为
0
4
6
10
14
- 从不同线程使用int64的不同字节安全吗
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 在UNIX系统中使用DIR查找文件的字节大小
- 如何使用Crypto++并为RSA返回可打印的字节/字符数组
- std::当在256字节边界上写入整数时,流的奇怪行为
- 当比特(而不是字节)的顺序至关重要时的持久性
- 从文件中读取多个字节,并将它们存储在C++中进行比较
- 如何在文件中查找字节序列
- luaL_dofile在已知良好的字节码上失败,可以使用未编译的版本
- 字节到位运算符重载C++
- 在java中读取c++字节的位字段
- 使用 std::vector::reverse_iterator 将 int 序列化为字节向量?
- 字节真的是最小可寻址单元吗
- struct.error:解压缩 C++ 结构时,解包需要 288 字节的缓冲区
- 读取文件中所有可能的十六进制 16 字节序列并打印每个序列
- 如何使用 OpenCV 解码在两个 UWP 应用之间发送的图像字节?
- 如何将字节数组元素替换为修改的十六进制 ASCII 符号?
- asn1c 不会从 asn.1 模块中提取八位字节字符串的默认值
- 如何将原始字节附加到 std::vector?
- 基于字节数组生成静态范围整数值