Chinaunix首页 | 论坛 | 博客
  • 博客访问: 89539
  • 博文数量: 42
  • 博客积分: 905
  • 博客等级: 准尉
  • 技术积分: 400
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-14 14:08
文章分类

全部博文(42)

文章存档

2015年(1)

2011年(41)

我的朋友

分类: LINUX

2011-03-28 21:00:10

不同的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。这时需要字节序转换。

转换代码:
  1. //short type
  2. short swapShort(short s) {
  3.     unsigned char c1, c2;

  4.     if (_system_endianness != _file_endianness) {
  5.         c1 = s & 255;
  6.         c2 = (s >> 8) & 255;
  7.         if ((_file_endianness == ENDIAN_2143)
  8.             && (_system_endianness == ENDIAN_4321)) {
  9.             return (c1 << 8) + c2;
  10.         } else if ((_file_endianness == ENDIAN_1234)
  11.                     && (_system_endianness == ENDIAN_4321)) {
  12.             return (c1 << 8) + c2;
  13.         } else {
  14.             return (c1 << 8) + c2;
  15.         }
  16.    } else {
  17.          return s;
  18.    }
  19. }
//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) |
0

上一篇:OCI 一个简单的例子

下一篇:gcc 降版本

给主人留下些什么吧!~~