iOS 网络编程-socket 大端小端
来源:互联网 发布:网络ip在哪里设置 编辑:程序博客网 时间:2024/06/04 18:01
大端格式和小端格式
一、概念:
不同的CPU有不同的字节序类型,指在内存中的保存顺序。
常见的有两种:
1.Little-endian: 将低序字节存储在起始地址(低位编码,低位开始);
2.Big-endian: 将高序字节存储在起始位置(高位编码,高位开始);
LE(little-endian):
符合人的思维的字节序
地址低位存储值的低位
地址高位存储值的高位
BE(big-endian):
直观的字节序
地址低位存储值的高位
地址高位存储值得低位
二、例子:
0x01020304 (DWORD)在内存地址4000 4001 4002 4003的存储方式:
内存地址:4000400140024003
LE:0403 02 01
BE:0102 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
- iOS 网络编程-socket 大端小端
- socket编程 -- 大端小端区别及转换
- socket 大端 小端 转换
- 【网络编程】大端模式和小端模式
- 【网络编程】大端小端模式及其转换
- iOS socket网络编程
- 《unix网络编程》(6)网络字节序 大端模式和小端模式
- linux网络编程之网络字节序、主机字节序、大端、小端
- 【IOS网络编程】socket编程
- 大端小端网络字节顺序
- 大端 小端 主机 网络 字节序
- 网络序、大端与小端问题
- 网络变成中的“大端”与“小端”
- 网络通信的大端小端问题
- 大端、小端、网络字节序
- 大端、小端、网络字节序
- 大端、小端、网络字节序
- 大端、小端、网络字节序
- 关于新闻类应用快速开发框架的思考
- 最大路径之和
- GDB调试多线程程序
- 201609
- 关于idea安装go插件无法进行debug的坑
- iOS 网络编程-socket 大端小端
- JS读取本地文件及目录的方法
- eclipse 打包 cocos2d-JS APK - 移植底层代码
- 4.2.2 常见的数据寻址方式
- NHibernate 映射基础(第三篇) 简单映射、联合主键
- Mac上mp3格式转caf格式
- 51nod 1305 Pairwise Sum and Divide
- Java线程的两种实现方法
- opencv svm的使用