我正在使用 MS C++。我正在使用类似
的结构 struct header {
unsigned port : 16;
unsigned destport : 16;
unsigned not_used : 7;
unsigned packet_length : 9;
};
struct header HR;
这里我需要把header的这个值放在单独的char数组中。
我做了 memcpy(&REQUEST[0], &HR, sizeof(HR));
但是 packet_length 的值没有正确显示。
就像我正在分配 HR.packet_length = 31; 我得到 -128(第五字节)和 15(第六字节)。
如果你能帮我解决这个问题,或者他们是否有更优雅的方法来做到这一点。
谢谢
最佳答案
听起来像是您的结构的预期行为,因为您将 packet_length
定义为 9 位长。所以它的值的最低位已经在内存的第五个字节之内。因此,您在那里看到的值 -128(因为 signed char 中 1 的最高位被解释为负值),而值 15 是第 6 个字节中剩余的值。
内存位看起来像这样(倒序,即从高位到低位):
byte 6 | byte 5 | ...
0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0
packet_length | not_used | ...
另请注意,这种方法可能不可移植,因为多字节变量中的字节顺序取决于平台(参见 endianness)。
更新:我不是跨平台开发方面的专家,您也没有详细说明请求的布局等。无论如何,在这种情况下,我会尝试将字段设置为单独请求,而不是将结构 memcopying 到其中。这样我至少可以控制每个字段的确切值。
关于c++ - C/C++如何将short转换为char,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2443079/