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

3

我正在使用微软的C++编程语言。我正在使用结构体,例如:

    struct header   {
        unsigned port : 16;
                unsigned destport : 16;
        unsigned not_used : 7;
        unsigned packet_length : 9;


    };
struct header HR;

我希望将头部的值放入一个单独的字符数组中。

我尝试使用 memcpy(&REQUEST[0], &HR, sizeof(HR));

但是,packet_length的值没有正确显示。

例如,如果我将 HR.packet_length 的值分配为 31; 我得到的是 -128(第五个字节)和15(第六个字节)。

如果您能帮助我解决这个问题或者有更优雅的方法,请告诉我。

谢谢

2个回答

2
似乎您定义的结构体中,packet_length被定义为9位长,因此其值的最低位已经在内存的第五个字节中。因此,在那里您看到的-128(因为有符号char类型中的最高位1被解释为负值),而15则是剩余在第六个字节中的值。
内存位如下(倒序排列,即从高到低位):
     byte 6    |     byte 5    | ...
0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 
 packet_length   |   not_used  | ...

请注意,这种方法可能不可移植,因为多字节变量内部的字节顺序取决于平台(请参见字节序)。
更新:我不是跨平台开发专家,你也没有告诉我太多有关请求布局等方面的细节。无论如何,在这种情况下,我会尝试单独设置请求字段,而不是将结构体复制到其中。这样,我至少可以控制每个字段的确切值。

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

更新:

我知道我可以直接使用结构体中的属性打印该值。但是我需要将此结构体发送到网络上,而我正在使用Java。

在这种情况下,使用一个字符数组(长度为16+16+7+9),并在另一端使用Java进行解析。
数组的大小将小于结构体,并且可以在单个MTU中进行更多的打包。


是的,我知道我可以直接使用结构体中的属性来打印该值。 但是我需要将此结构体发送到网络上,而我正在使用Java。 由于我无法在Java中拥有此结构体,因此我遇到了“Peter Torok”所解释的问题。 - changed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接