我正在使用ms c ++。我正在使用像
这样的结构 struct header {
unsigned port : 16;
unsigned destport : 16;
unsigned not_used : 7;
unsigned packet_length : 9;
};
struct header HR;
这里头的这个值我需要放在单独的char数组中。
我做了memcpy(&REQUEST[0], &HR, sizeof(HR));
但是packet_length的值没有正确显示。
就像我分配HR.packet_length = 31; 我得到-128(第五个字节)和15个(第六个字节)。
如果你可以帮助我,或者他们是更优雅的方式来做到这一点。
感谢
答案 0 :(得分:2)
听起来像你的结构的预期行为,因为你将packet_length
定义为9位长。因此,其值的最低位已经在内存的第五个字节内。因此,您在那里看到的值-128(作为有符号字符中的最高位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)。
更新:我不是跨平台开发方面的专家,您也没有详细说明请求的布局等等。无论如何,在这种情况下我会尝试设置字段请求单独而不是将结构存储到其中。这样我至少可以控制每个字段的确切值。
答案 1 :(得分:1)
struct header {
unsigned port : 16;
unsigned destport : 16;
unsigned not_used : 7;
unsigned packet_length : 9;
};
int main(){
struct header HR = {.packet_length = 31};
printf("%u\n", HR.packet_length);
}
$ gcc new.c&& ./a.out
31
更新
我现在可以使用struct中的属性直接打印该值。但我需要在网络上发送这个结构,他们正在使用java。
在这种情况下,使用字符数组(长度为16 + 16 + 7 + 9)并使用java在另一侧进行解析。
数组的大小将小于struct,并且在单个MTU中可以实现更多的打包。