c - 如何在C中将struct转换为char数组

标签 c pointers struct char

我正在尝试将结构转换为字符数组以通过网络发送。但是,当我这样做时,我从 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/

相关文章:

c - 具有相同成员类型的 C 结构是否保证在内存中具有相同的布局?

c - 我对链表有一些问题

c - 使用 ANTLR C 目标,如何使用操作来打印 token ?

c - fprintf 中的字符串是错误的数据类型(%s)

c - 是否可以检查取消引用任意内存是否会使 C 中的程序先验崩溃?

c - 如何将字符串数组形式的特定元素的地址传递给另一个函数

c - 查看 C 结构在构建期间是如何打包的

c - 如何改变if else语句进行切换?

c - 从 Linux 内核发送 IP 数据包,没有目标 MAC 地址

c - 指针指向指针的内存泄漏