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 大端格式和小段格式
- iOS 网络编程大小端格式
- UNIX网络编程练习-大小端判断
- 网络编程中大小端字节的使用剖析
- ios 几种格式录音大小
- Android - 网络编程 - JSON - 格式
- 网络编程中的协议格式
- 网络编程之格式转换
- iOS 网络编程-socket 大端小端
- iOS网络编程总结
- iOS网络编程总结
- ios网络编程
- ios网络编程
- IOS网络编程
- ios网络编程
- IOS网络编程介绍
- ios网络编程
- ios 网络编程总结
- ios网络编程
- string全排列
- Linux命令 --- 查找筛选grep
- C# 中用 PadLeft、PadRight 补足位数
- Selenium模拟选课
- How to fix exception: Failed to instantiate SLF4J LoggerFactory?
- iOS 网络编程大小端格式
- mysql:GTID复制切换成传统复制
- 校园网一键登录注销
- structs2如何获取web资源
- Kinect2的安装以及关于OpenNI2遇到的问题(OpenNI2显示no devices found)
- iOS开发中AFNetworking中如何设置https请求(使用自建证书)
- eclipse的maven项目部署到tomcat
- Ajax实现页面局部刷新
- 二进制理解