c / c ++如何将short转换为char

时间:2010-03-14 17:47:46

标签: c++ c struct

我正在使用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个(第六个字节)。

如果你可以帮助我,或者他们是更优雅的方式来做到这一点。

感谢

2 个答案:

答案 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中可以实现更多的打包。