如何在内核中的一个数组中连接四个整数?
How to concatenate four integers in one array in kernel?
我有两个 32 位整数和两个 16 位整数。如何在内核中将它们组合成一个 12 字节长的数组?
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
这是一种 (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
您可能想要添加一些(特定于编译器的)填充指令以确保整数也是 "packed"。不过,上面的内容对于许多编译器来说都很好。
我有两个 32 位整数和两个 16 位整数。如何在内核中将它们组合成一个 12 字节长的数组?
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
这是一种 (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
您可能想要添加一些(特定于编译器的)填充指令以确保整数也是 "packed"。不过,上面的内容对于许多编译器来说都很好。