我有一个结构,看起来像这样字节铸造时跳过发生
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)发送数据和我的接收器(结构在接收器中)之后(在窗口上)之后,输出数据不符合。
假设数据从模拟器发送是:
msg num : 1010
msg len : 20
hardware version: 1
从Wireshark的 location: 25
messages: //rest of the bytes
包表示:
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
被丢弃或跳过了,我不确定哪一个,因为我找不到方法来确定它,而接下来的4个00 19 00 00
的字节被投入我的sender_location
。
发件人的所有消息类型和长度均基于发件人的设计规范构建,而发件人的hardware version
为unsigned short
。
我有以下问题念起来和答案
Fields in a struct skipping bytes
,我已经尝试过,但都无济于事,请告知。
是否使用旧的编译器不支持[C99固定宽度的整数类型](http://en.cppreference.com/w/c/types/整数)还是可以打包结构?有没有其他的理由你有一个位域? –
我正在使用VS 2015,并且我使用位域来限制每个变量的字节数,我是一名初级程序员,使用位域是由我的高级“推荐”,我最初使用的是每个域的memcpy,但是被告知把它转换成一个结构并不复杂。 – Zac
至于你的问题,你是否试图分别分配消息结构,然后使用'memcpy'来复制数据(整个结构)? –