不同的cpu类型有不同的字节序,字节序指的是字节在内存中的保存顺序。
Little-Endian:低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。
采用intel x86或其兼容芯片的系统都是Little-Endian,包含arm构建。
例如:0x1234 -> 0x34 0x12
Big-Endian:
高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。
采用powerpc构架的机器一般都是Big-Endian,比如ibm的小型机,(比如运行aix操作系统的)。
例如:0x1234 -> 0x12 0x34
在cpu不同类型的机器上传递数据时,就要进行必要的字节转换。
file_endian 0x4321
system_endian 0x4321
内存中 DF 01 被当作short类型读取时,*((short *)(data))得到的是0x1df。这种情况不需要字节序转换。
file_endian 0x1234
system_endian 0x4321
内存中 01 DF 被当作short类型读取时,得到的是0xdf01。这时需要字节序转换。
转换代码:
- //short type
- short swapShort(short s) {
-
unsigned char c1, c2;
-
-
if (_system_endianness != _file_endianness) {
-
c1 = s & 255;
-
c2 = (s >> 8) & 255;
-
if ((_file_endianness == ENDIAN_2143)
-
&& (_system_endianness == ENDIAN_4321)) {
-
return (c1 << 8) + c2;
-
} else if ((_file_endianness == ENDIAN_1234)
-
&& (_system_endianness == ENDIAN_4321)) {
-
return (c1 << 8) + c2;
-
} else {
-
return (c1 << 8) + c2;
-
}
-
} else {
-
return s;
-
}
-
}
//int type
int swapInt(int i) {
unsigned char c1, c2, c3, c4;
if (_system_endianness != _file_endianness) {
c1 = i & 255;
c2 = (i >> 8) & 255;
c3 = (i >> 16) & 255;
c4 = (i >> 24) & 255;
if ((_file_endianness == ENDIAN_2143)
&& (_system_endianness == ENDIAN_4321)) {
return ((int)c2 << 24) + ((int)c1<< 16) + ((int)c4 << 8) + c3;
} else if ((_file_endianness == ENDIAN_1234)
&& (_system_endianness == ENDIAN_4321)) {
return ((int)c1 << 24) + ((int)c2 << 16) + ((int)c3 << 8) + c4;
} else {
return ((int)c1 << 24) + ((int)c2 << 16) + ((int)c3 << 8) + c4;
}
} else {
return i;
}
}
阅读(1297) | 评论(0) | 转发(0) |