IM相关高级工程师原理ios developers

iOS socket连接中的字节序

2016-06-01  本文已影响1113人  童冀

什么是字节序

采用维基百科的解释如下:

在几乎所有的机器上,多字节对象都被存储为连续的字节序列。例如在C语言中,一个类型为int的变量x地址为0x100,那么其对应地址表达式&x的值为0x100。且x的四个字节将被存储在存储器的0x100, 0x101, 0x102, 0x103位置。
而存储地址内的排列则有两个通用规则。一个多位的整数将按照其存储地址的最低或最高字节排列。如果最低有效字节在最高有效字节的前面,则称小端序;反之则称大端序。在网络应用中,字节序是一个必须被考虑的因素,因为不同机器类型可能采用不同标准的字节序,所以均按照网络标准转化。
例如假设上述变量x类型为int,位于地址0x100处,它的十六进制为0x01234567,地址范围为0x100~0x103字节,其内部排列顺序依赖于机器的类型。大端法从首位开始将是:0x100: 01, 0x101: 23,..。而小端法将是:0x100: 67, 0x101: 45,..

Big-Endian.png Little-Endian.png

网络字节序

谈网络字节序(Endianness)之前我们先说说什么是字节序。字节序又叫端序,就是指计算机中存放 多字节数据的字节的顺序。典型的就是数据存放在内存中或者网络传输时的字节的顺序。常用的字节序有大端序(big-endian),小端序(litle-endian,另还有不常见的混合序middle-endian)。不同的CPU可能会使用不同的字节序,如X86,PDP-11等处理器为小端序,Motorola 6800,PowerPC 970等使用的是大端序。小端序是指低字节位存放在内存地址的低端,高端序是指高位字节存放在内存的低端。 举个例子来说明什么是大端序和小端序: 比如一个4字节的整数 16进制形式为 0x12345678,最左边是高位。

大端序

低位 > > > > 高位

12 34 56 78

小端序

低位 > > > > 高位

78 56 34 12

TCP/IP 各层协议将字节序使用的是大端序,我们把TCP/IP协议中使用的字节序称之为网络字节序。 编程的时候可以使用定义在sys/_endian.h中的相关的接口进行本地字节序和网络字节序的互转。

iOS开发中应用

方法一(宏定义):
#define ntohs(x)    __DARWIN_OSSwapInt16(x) // 16位整数 网络字节序转主机字节序
#define htons(x)    __DARWIN_OSSwapInt16(x) // 16位整数 主机字节序转网络字节序
#define ntohl(x)    __DARWIN_OSSwapInt32(x)  //32位整数 网络字节序转主机字节序
#define htonl(x)    __DARWIN_OSSwapInt32(x) //32位整数 主机字节序转网络字节序

以上声明中 n代表netwrok, h代表host ,s代表short,l代表long
如果数据是单字节的话,则其没有字节序的说法了。

方法二(直接转换):
// Convert result to 4 byte big-endian (network byte order)
// and then convert to raw data.
    
    UInt32 result = OSSwapHostToBigInt32((uint32_t)resultHostNum);
    
    return [NSData dataWithBytes:&result length:4];
上一篇 下一篇

猜你喜欢

热点阅读