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这些类型的数值转换为字符串?