C Union 中的 Endian Swap
Endian Swap in C Union
我想了解在 C 的联合内完成字节序交换的工作方式。我知道联合能够保存多种类型的数据,但一次只能保存一种类型。我试图理解的代码看起来像这样,这是联合定义:
union byte4 {
char byte[4];
int numint;
float numfloat;
};
这是函数。
int endianSwap4int(int a) {
union byte4 un;
un.numint = a;
// swap
char c1 = un.byte[0];
un.byte[0] = un.byte[3];
un.byte[3] = c1;
c1 = un.byte[1];
un.byte[1] = un.byte[2];
un.byte[2] = c1;
return un.numint;
}
函数中,如果输入a
为2048327680,返回un.numint
时函数returns6010。我知道操纵 un.byte
也是间接操纵 un.numint
因为工会一次只能持有一件事,但我不明白它们是如何相互影响的,所以我的问题是,究竟如何它们相互影响吗?
如果您查看 2048327680
的十六进制表示,您会发现它是 7A 17 00 00
。因此,如果您的机器以小端格式存储此值,则首先存储 LSB。
如果我们给endianSwap4int
添加额外的调试如下:
int endianSwap4int(int a) {
union byte4 un;
int i;
un.numint = a;
printf("before:\n");
for (i=0;i<4;i++) {
printf("un[%d]=%02X\n", i, un.byte[i]);
}
// swap
char c1 = un.byte[0];
un.byte[0] = un.byte[3];
un.byte[3] = c1;
c1 = un.byte[1];
un.byte[1] = un.byte[2];
un.byte[2] = c1;
printf("after:\n");
for (i=0;i<4;i++) {
printf("un[%d]=%02X\n", i, un.byte[i]);
}
return un.numint;
}
您将看到以下输出:
before:
un[0]=00
un[1]=00
un[2]=17
un[3]=7A
after:
un[0]=7A
un[1]=17
un[2]=00
un[3]=00
这里可以看到交换前原数的LSB在前,交换后原数的MSB在前。所以现在联合的 int
部分包含值 00 00 17 7A
,十进制为 6010
.
我想了解在 C 的联合内完成字节序交换的工作方式。我知道联合能够保存多种类型的数据,但一次只能保存一种类型。我试图理解的代码看起来像这样,这是联合定义:
union byte4 {
char byte[4];
int numint;
float numfloat;
};
这是函数。
int endianSwap4int(int a) {
union byte4 un;
un.numint = a;
// swap
char c1 = un.byte[0];
un.byte[0] = un.byte[3];
un.byte[3] = c1;
c1 = un.byte[1];
un.byte[1] = un.byte[2];
un.byte[2] = c1;
return un.numint;
}
函数中,如果输入a
为2048327680,返回un.numint
时函数returns6010。我知道操纵 un.byte
也是间接操纵 un.numint
因为工会一次只能持有一件事,但我不明白它们是如何相互影响的,所以我的问题是,究竟如何它们相互影响吗?
如果您查看 2048327680
的十六进制表示,您会发现它是 7A 17 00 00
。因此,如果您的机器以小端格式存储此值,则首先存储 LSB。
如果我们给endianSwap4int
添加额外的调试如下:
int endianSwap4int(int a) {
union byte4 un;
int i;
un.numint = a;
printf("before:\n");
for (i=0;i<4;i++) {
printf("un[%d]=%02X\n", i, un.byte[i]);
}
// swap
char c1 = un.byte[0];
un.byte[0] = un.byte[3];
un.byte[3] = c1;
c1 = un.byte[1];
un.byte[1] = un.byte[2];
un.byte[2] = c1;
printf("after:\n");
for (i=0;i<4;i++) {
printf("un[%d]=%02X\n", i, un.byte[i]);
}
return un.numint;
}
您将看到以下输出:
before:
un[0]=00
un[1]=00
un[2]=17
un[3]=7A
after:
un[0]=7A
un[1]=17
un[2]=00
un[3]=00
这里可以看到交换前原数的LSB在前,交换后原数的MSB在前。所以现在联合的 int
部分包含值 00 00 17 7A
,十进制为 6010
.