1.Endian的由来
Endian这个词最早出自于乔纳森·斯威夫特所写的《格列佛游记》,书中根据人们吃 鸡蛋的方式将人分为两类:一类为从圆头打开鸡蛋开始吃的人(big endian);一类为从尖头打开鸡蛋开始吃的人(little endian)。《格列佛游记》中描述的小人国因为吃鸡蛋的方式不同而发生内战,此虚构的故事实为讽刺当时的英国议会中毫无意义的党派斗争,统治集团的昏庸腐朽和唯利视图。
2.大小端的定义
考虑一个16位整数,它由2个字节组成。内存中存储这两个字节有两种方法:一种方法是将低序字节存储在低地址,高序字节存储在高地址,这种存储方式称为小端(little endian);另一种方法是将高序字节存储在低地址,低序字节存储在高地址,这种存储方式成为大端(big endian)。
3.常见处理器的大小端模式
i386 小端
power pc 大端
sparc64 大端
arm 大小端可配置
mips 大端模式
大小端模式是由处理器决定的,与具体操作系统没有关系,对于程序员来说编写程序完全可以按照小端模式来编写,编译器会帮我们处理大小端的问题。
4.大小端的影响
网络协议中存在一个网络字节序,网际协议使用大端字节序传送多字节整数。从理论上说,具体实现可以按主机字节序存储套接字地址结构中的各个字段,等到需要在这些字段和协议首部相应字段之间移动时,再在主机字节序和网络字节序之间进行互转,让我们免于操心转换细节。linux系统当中提供了主机字节序和网络字节序之间转换的函数:
#include 《netinet/in。h》
uint16_t htons(uint16_t host16bitvalue); //16位主机字节序转化为网络字节序
uint16_t ntohs(uint16_t net16bitvalue); //16位网络字节序转化为主机字节序
uint32_t htons(uint32_t host16bitvalue); //32位主机字节序转化为网络字节序
uint32_t ntohs(uint32_t net16bitvalue); //32位网络字节序转化为主机字节序
5.大小端的判断方法
/*
*name: bool judgeBigEndianCPU()
*function: Judge CPU whether is big-endian
*input: none
*output: none
*return: true- is big endian
* false- is little endian
*/