Big-endian和little-endian是描述排列存储在计算机内存里的字节序列的术语。
Big-endian(从左到右的习惯方式)是一种大值的一端(序列中更典型值)存在前面(在最小的存储地址)的顺序。Little-endian是一种小值的一端(序列中较不典型的值)存储在前的顺序。比如,在Big-endian的电脑中,需要两个字节把十六位数4F52当作4F52存在存储器中(如果4F存在存储地址1000中,比如说,52将存在1001中)。在little-endian系统里,将被存为524F(52存在存储地址1000中,比如说,4F将存在1001中)。
Big-endian 的机器有:IBM的370主机,Motorola的微处理器,TCP/IP也使用big-endian方法,moto的68K系列和dec的sparc
Little-endian的机器有:Intel处理器(CPUs)和DEC Alphas和至少一些在他们的平台的其他程序
Big-Endian 和 Little-Endian 字节排序
字节排序 含义
Big-Endian 一个Word中的高位的Byte放在内存中这个Word区域的低地址处。
Little-Endian 一个Word中的低位的Byte放在内存中这个Word区域的低地址处。
必须注意的是:表中一个Word的长度是16位,一个Byte的长度是8位。如果一个数超过一个Word的长度,必须先按Word分成若干部分,然后每一部分(即每个Word内部)按Big-Endian或者Little-Endian的不同操作来处理字节。
如果我们将0x1234abcd写入到以0x0000开始的内存中,则结果为
big-endian little-endian
0x0000 0x12 0xcd
0x0001 0x34 0xab
0x0002 0xab 0x34
0x0003 0xcd 0x12
对网络数据包的处理,接收到网络数据包,根据字节顺序进行存储,需要在网络字节顺序和主机字节顺序之间进行转换,c语言中提供的转换函数有:
#include <arpa/inet.h>
uint32_t ntohl(uint32_t netlong); netlong:一个以网络[字节顺序表达的32位数。
uint32_t htonl(uint32_t hostlong); hostlong:主机字节顺序表达的32位数。
u_short htons( u_short hostshort); hostshort:主机字节顺序表达的16位数。
uint16_t ntohs(uint16_t netshort); 本函数将一个32位数从主机字节顺序转换成网络字节顺序。
对内存赋值函数
#include <string.h><cstring>
void *memset(void *s,int ch,size_t n); 将s中前n个字节用ch替换并返回s;
void *memcpy(void *dest, const void *src, size_t n); 从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中