1. 如何判断大小端设备
#include <iostream> using namespace std; typedef union utest { int a; char b; }utest; int main(int argc, char** argv) { utest ut; ut.a = 0xff030211; if (ut.b == 0x11) { std::cout << "this is le" << std::endl; } else if (ut.b == 0xff) { std::cout << "this is be" << std::endl; } return 0; }
解释:通过使用共用体的方式判断是否是大端设备,还是小端设备:
在union中,所占的字节数为最大的成员所占自己数:对于大端设备,数据的低字节存放在内存中的高地址,高字节存在在内存的低地址;
而对于char类型,只是一个字节,大小端对齐存放位置无影响,存放在低地址;
因此,如果是大端设备,0xff030211数据中,0x11应该存放在高地址位,0xff存放在低地址位;
此时,通过char 取低地址判断值即可确定大小端设备;
2. 如何将大端字节序和小端字节序进行互换
linux系统中存在以下几个系统级别的宏:
__BYTE_ORDER == __BIG_ENDIAN // 等式成立,则表示大端设备;
__BYTE_ORDER == __LITTLE_ENDIAN // 等式成立,则表示小端设备;
大小端字节序互换可使用,以下两个系统的函数,进行字节序互换:
#include <byteswap.h>
__bswap_32 4字节
__bswap_16 2字节
int main(int argc, char** argv)
{
int a = 0xcc030211;
printf("a = 0x%04x
", a);
a = __bswap_32(a);
printf("a = 0x%04x
", a);
return 0;
}
a = 0xcc030211
a = 0x110203cc
int main(int argc, char** argv)
{
int a = 0xcc030211;
printf("a = 0x%04x
", a);
a = __bswap_32(a);
printf("a = 0x%04x
", a);
unsigned short b = 0xff11;
printf("b = 0x%x
", b);
b = __bswap_16(b);
printf("b = 0x%x
", b);
return 0;
}
a = 0xcc030211
a = 0x110203cc
b = 0xff11
b = 0x11ff