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

Posted

技术标签:

【中文标题】c / c ++如何将short转换为char【英文标题】:c/c++ how to convert short to char 【发布时间】:2010-03-14 17:47:45 【问题描述】:

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

如果你能帮我解决这个问题,或者他们的方式更优雅。

谢谢

【问题讨论】:

【参考方案1】:

听起来像您将 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)。

更新:我不是跨平台开发专家,您也没有详细说明您的请求布局等。无论如何,在这种情况下,我会尝试设置字段单独请求而不是将结构复制到其中。这样我至少可以控制每个单独字段的确切值。

【讨论】:

【参考方案2】:
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 进行解析。 数组的大小将小于 struct,并且可以在单个 MTU 中进行更多打包。

【讨论】:

是的,我现在可以通过使用结构中的属性直接打印该值。但我需要在网络上发送这个结构,他们我正在使用 java。由于我无法在 Java 中使用此结构,因此我面临“Peter Torok”所解释的问题。

以上是关于c / c ++如何将short转换为char的主要内容,如果未能解决你的问题,请参考以下文章

c语言中如何将short,int,long,float这些类型的数值转换为字符串?

c语言中如何将short,int,long,float这些类型的数值转换为字符串?

C 将 char 转换为 char*

如何在 C 中将 short 转换为 unsigned char *buf?

C语言有没有个语句可以把short转换成char[]

高手请进!如何把整形数据转换为字符串(C语言)?