大端字节序转换为小端字节序的C语言示例
普通写法:
#include <stdio.h>
void swapEndian16(uint16_t *data) {
*data = (*data >> 8) | (*data << 8);
}
void swapEndian32(uint32_t *data) {
*data = (*data >> 24) | ((*data & 0x00FF0000) >> 8) |
((*data & 0x0000FF00) << 8) | (*data << 24);
}
int main() {
uint16_t data16 = 0xABCD;
uint32_t data32 = 0x12345678;
printf("Before conversion: 0x%X, 0x%X\n", data16, data32);
swapEndian16(&data16);
swapEndian32(&data32);
printf("After conversion: 0x%X, 0x%X\n", data16, data32);
return 0;
}
这个示例程序定义了两个函数swapEndian16和swapEndian32,分别用于将16位和32位整数的大端字节序转换为小端字节序。在主函数中,我们定义了两个变量data16和data32,并打印出它们在进行字节序转换前后的值。
运行此程序会得到以下输出:
Before conversion: 0xABCD, 0x12345678
After conversion: 0xCDAB, 0x78563412
可以看到,在进行字节序转换后,16位整数的值从0xABCD变成了0xCDAB,32位整数的值从0x12345678变成了0x78563412。
优雅写法:
# define swapEndia32(x) \
(((uint32_t)((const uint8_t*)(x))[0] << 24) | \
(((const uint8_t*)(x))[1] << 16) | \
(((const uint8_t*)(x))[2] << 8) | \
((const uint8_t*)(x))[3])