我正在尝试将结构转换为字符数组以通过网络发送。但是,当我这样做时,我从 char 数组中得到了一些奇怪的输出。
#include <stdio.h>
struct x
{
int x;
} __attribute__((packed));
int main()
{
struct x a;
a.x=127;
char *b = (char *)&a;
int i;
for (i=0; i<4; i++)
printf("%02x ", b[i]);
printf("\n");
for (i=0; i<4; i++)
printf("%d ", b[i]);
printf("\n");
return 0;
}
这是 a.x 的各种值的输出(在使用 gcc 的 X86 上):
127:
7f 00 00 00
127 0 0 0
128:
ffffff80 00 00 00
-128 0 0 0
255:
ffffffff 00 00 00
-1 0 0 0
256:
00 01 00 00
0 1 0 0
我理解 127 和 256 的值,但为什么在转到 128 时数字会发生变化?为什么不只是: 80 00 00 00 128 0 0 0
我是否忘记在转换过程中做某事,或者我是否忘记了有关整数表示的某些事情?
*注意:这只是一个小测试程序。在一个真实的程序中,我在结构中有更多,更好的变量名,并且我转换为小端。
*编辑:格式化
最佳答案
您看到的是保留从 char 到 int 的转换的符号。该行为是由于在您的系统上对 char 进行了签名(注意: char 并非在所有系统上都进行了签名)这一事实造成的。如果位模式对 char 产生负值,这将导致负值。将这样的 char 提升为 int 将保留符号,并且 int 也将为负数。请注意,即使您没有显式放置 (int)
,编译器也会在传递给 printf 时自动将该字符提升为 int。解决方案是首先将您的值转换为 unsigned char
:
for (i=0; i<4; i++)
printf("%02x ", (unsigned char)b[i]);
或者,您可以从一开始就使用 unsigned char*
:
unsigned char *b = (unsigned char *)&a;
然后在使用 printf 打印时不需要任何转换。
关于c - 如何在C中将struct转换为char数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/433682/