如何在内核中的一个数组中连接四个整数?

时间:2015-04-20 14:37:52

标签: c linux kernel

我有两个32位整数和两个16位整数。如何将它们组合成内核中的一个12字节长数组?

2 个答案:

答案 0 :(得分:2)

这是一种(C99)方式,如果你想要机器的本机字节排序:

union {
  struct {
    uint32_t a, b;
    uint16_t c, d;
  } ints;
  char bytes[12];
} tmp;

tmp.ints.a = 0xdeadf00d;
tmp.ints.b = 0xfeedbabe;
tmp.ints.c = 0xfee1;
tmp.ints.d = 0x600d;

现在,您可以访问tmp.bytes数组以获取组成数字的字节。在ideone上,bytes包含:

0d f0 ad de be ba ed fe e1 fe 0d 60

您可能希望添加一些(特定于编译器的)填充指令,以确保整数是"打包"。不过,上面的内容对于许多编译器来说都是不错的。

答案 1 :(得分:-1)

char a[12];
char* b = &a[0];
int* c = (int*)b;
c[0] = n1;
c[1] = n2;
short* d = (short*)(b + 8);
d[0] = s1;
d[1] = s2;

编辑:当这些状态保留在函数中时,就没有严格的别名问题。

此外,如果您想了解有关别名的更多信息,请从GCC的源代码中找到此函数:c_common_get_alias_set