iOS 网络编程大小端格式

来源:互联网 发布:张亮中餐厅知乎 编辑:程序博客网 时间:2024/05/16 02:20

一、概念:

不同的CPU有不同的字节序类型,指在内存中的保存顺序。

常见的有两种:

1.Little-endian: 将低序字节存储在起始地址(低位编码,低位开始);

2.Big-endian: 将高序字节存储在起始位置(高位编码,高位开始);


LE(little-endian):

符合人的思维的字节序

地址低位存储值的低位

地址高位存储值的高位


BE(big-endian):

直观的字节序

地址低位存储值的高位

地址高位存储值得低位



二、例子:

0x01020304 (DWORD)在内存地址4000 4001 4002 4003的存储方式:

内存地址:4000 40014002 4003

LE:04 03 02 01

BE:01 02 03 04

注:每个地址存1个字节,每个字有4个字节。2位16进制数是1个字节(0xFF = 1111 1111)




三、注意:

1.x86系列的CPU都是little-endian的字节序;

2.一般操作系统都是小端,而通信协议是大端的;

3.创建CPU的字节序:

Big-Endian: PowerPC、IBM、Sun

Little-Endian:x86、DEC

ARM既可以工作在大端模式,也可以工作在小端模式。

4.常见的文件的字节序:

Adobe PS : Big Endian

BMP: Little Endian

DXF(AutoCAD):Variable

GIF:Little Endian

JPEG:Little Endian

MacPaint: Big Endian

RTF:Little Endian




四、工具:

1.判断机器的字节序:

BOOL isBigEndian()

{

int a = 0x1234;

// 通过将int强制类型转换成char单字节,通过判断其实存储位置

char b = *(char *)&a;

if (b == 0x12) {

return YES;

}

return NO;

}




2.联合体 union的存放顺序死所有的成员都从地地址开始存放,利用该特性就可以轻松获得CPU对内存采用的Little-endian还是Big-endian模式读写:

BOO isBigEndian()

{

union NUM

{

int a;

char b;

} num;

num.a = 0x1234;

if (num.b == 0x12) {

return YES;

}

return NO;

}



/**

 *  @brief 64位数据高度和低地址的交换

 *

 *  @param A 值

 *

 *  @return 返回结果

 */

#define BigSwapLittle64(A)      ((((uint64)(A) & 0xff00000000000000) >> 56) | \

(((uint64)(A) & 0x00ff000000000000) >>40) | \

(((uint64)(A) & 0x0000ff0000000000) >>24) | \

(((uint64)(A) & 0x000000ff00000000) >>8) | \

(((uint64)(A) & 0x00000000ff000000) <<8) | \

(((uint64)(A) & 0x0000000000ff0000) <<24) | \

(((uint64)(A) & 0x000000000000ff00) <<40) | \

(((uint64)(A) & 0x00000000000000ff) <<56))



/**

 *  @brief 32位数据高度和低地址的交换

 *

 *  @param A 值

 *

 *  @return 返回结果

 */

#define BigSwapLittle32(A)      ((((uint32)(A) & 0xff000000) >> 24) | \

(((uint32)(A) & 0x00ff0000) >>8) | \

(((uint32)(A) & 0x0000ff00) <<8) | \

(((uint32)(A) & 0x000000ff) <<24))




/**

 *  @brief 16位数据高度和低地址的交换

 *

 *  @param A 值

 *

 *  @return  返回结果

 */

#define BigSwapLittle16(A)      ((((uint16)(A) & 0xff00) >> 8) | \

(((uint16)(A) & 0x00ff) <<8))



五、备注参考:


1.http://www.cnblogs.com/passingcloudss/archive/2011/05/03/2035273.html

2.http://blog.csdn.net/goldfighter/article/details/8289215


六、资料下载:

1.iOS 网络编程,client 与 server 大小端格式问题,Objective-C语言工具一份:自定义的父类

2.文档:iOS 大端格式和小段格式





0 0
原创粉丝点击