http://packetmania.blogchina.com/

Endianness 的问题实质就是关于计算机如何存储大的数值的问题。

我们知道一个基本存储单元可以保存一个字节,每个存储单元对应一个地址。对于大于十进制255(16进制0xff)的整数,需要多个存储单元。例如,4660对应于0x1234,需要两个字节。不同的计算机系统使用不同的方法保存这两个字节。在我们常用的PC机中,低位的字节0x34保存在低地址的存储单元,高位的字节0x12保存在高地址的存储单元;而在Sun工作站中,情况恰恰相反,0x34位于高地址的存储单元,0x12位于低地址的存储单元。前一种就被称为Little Endian,后一种就是Big Endian。

如何记住这两种存储模式?其实很简单。首先记住我们所说的存储单元的地址总是由低到高排列。对于多字节的数值,如果先见到的是低位的字节,则系统就是Little Endian的,Little 就是"小,少"的意思,也就对应"低"。相反就是Big Endian,这里 Big "大"对应"高"。

为了加深对Endianness的理解,让我们来看下面的C程序例子:

 char a = 1;       
 char b = 2;           地址偏移量  内存映像
 short c = 255; /* 0x00ff */          0x0000:  01 02 FF 00
 long d = 0x44332211;            0x0004:  11 22 33 44

在右侧我们可以见到在基于Intel 80x86的系统上的内存映像,显然我们可以马上判定这一系统是Little Endian的。对于16位的整形数(short)c,我们先见到其低位的0xff,下一个才是0x00。同样对于32位长整形数(long)d,在最低的地址0x0004存的是最低位字节0x11。如果是在Big Endian的计算机中,则地址偏移量从0x0000到0x0007的整个内存映像将为:01 02 00 FF 44 33 22 11。

所有计算机处理器都必须在这两种Endian间作出选择。但某些处理器(如MIPS和IA-64)支持两种模式,可由编程者通过软件或硬件设置一种Endian。以下是一个处理器类型与对应的Endian的简表:

  • 纯Big Endian: Sun SPARC, Motorola 68000,Java Virtual Machine
  • Bi-Endian, 运行Big Endian模式: MIPS运行IRIX, PA-RISC,大多数Power和PowerPC系统
  • Bi-Endian, 运行Little Endian模式: MIPS  运行Ultrix,大多数DEC Alpha, IA-64运行Linux
  • Little Endian: Intel x86,AMD64,DEC VAX
    如何在程序中检测本系统的Endianess?可调用下面的函数来快速验证,如果返回值为1,则为Little Endian;为0则是Big Endian:
    int testendian() {    int x = 1;    return *((char *)&x);}

    Endianness对于网络通信也很重要。试想当Little Endian系统与Big Endian的系统通信时,如果不做适当处理,接收方与发送方对数据的解释将完全不一样。比如对以上C程序段中的变量d,Little Endian发送方发出11 22 33 44四个字节,Big Endian接收方将其转换为数值0x11223344。这与原始的数值大相径庭。为了解决这个问题,TCP/IP协议规定了专门的"网络字节次序",即无论计算机系统支持何种Endian,在传输数据时,总是数值最高位的字节最先发送。从定义可以看出,网络字节次序其实是对应Big Endian的。

    为了避免因为Endianness造成的通信问题,及便于软件开发者编写易于平台移植的程序,特别定义了一些C语言预处理的宏来实现网络字节与主机字节次序之间的相互转换。htons()和htonl()用来将主机字节次序转成网络字节次序,前者应用于16位无符号数,后者应用于32位无符号数。ntohs()和ntohl()实现反方向的转换。这四个宏的原型定义可参考如下(Linux系统中可在netinet/in.h文件里找到):

    #if defined(BIG_ENDIAN) && !defined(LITTLE_ENDIAN)
    #define htons(A)  (A)
    #define htonl(A)  (A)
    #define ntohs(A)  (A)
    #define ntohl(A)  (A)
    #elif defined(LITTLE_ENDIAN) && !defined(BIG_ENDIAN)
    #define htons(A)  ((((uint16)(A) & 0xff00) >> 8) | /
    (((uint16)(A) & 0x00ff) << 8))
    #define htonl(A)  ((((uint32)(A) & 0xff000000) >> 24) | /
    (((uint32)(A) & 0x00ff0000) >> 8)  | /
    (((uint32)(A) & 0x0000ff00) << 8)  | /
    (((uint32)(A) & 0x000000ff) << 24))
    #define ntohs     htons
    #define ntohl     htohl
    #else
    #error "Either BIG_ENDIAN or LITTLE_ENDIAN must be #defined, but not both."
    #endif

Endianness一点通相关推荐

  1. 一点通路由器模拟软件最新版_2019年高压电工作业考试最新版题库及答案(全部判断题)...

    微信也可以搜索小程序或者公号"安全生产模拟考试一点通""进行全部题库练习和模拟考试,错题练习,成绩测评 第1题.[判断题] 三相交流对称电路中,如采用三角形接线时,线电流 ...

  2. 《天气一点通》隐私策略

    天气一点通不会收集.存储.分享您的任何个人信息或者与您的设备相关的信息.我们不会收集任何统计数据和分析数据,也不会跟踪用户的行为. 转载于:https://www.cnblogs.com/codero ...

  3. php一点通,编程一点通app-编程一点通官方版下载v1.0.1-七度网

    编程一点通app是一款专业的手机在线编程学习软件,超级适合入门级学员,包含的编程语言丰富,可以满足不同用户的学习需求,感兴趣的用户还可以针对自己喜欢的内容进行在线学习,掌握更多专业化的知识,推荐大家都 ...

  4. emc整改措施及案例_12.5EMC一点通||EMC整改措施

    点击关注,EMC学习技巧一点通! EMC整改措施 静电精要 1.第一个是疏导,也就是说快速泄放掉静电电流,或者是通过其他的路径,尽量避开相关的敏感器件. 2.第二个就是围堵,就是通过相应的措施使静电放 ...

  5. Android版‘音乐一点通’音乐播放器详情

    项目描述: 音乐一点通是一款集成本地音乐,网络音乐的音乐播放器,不仅界面美观,而且更加人性化,可以完全替换Android自带的播放器. 特点描述: 支持1.5版本以上Android系统 支持添加桌面小 ...

  6. 局域网一点通之组网、管网、用网1000问

    (51cto.com)局域网一点通之组网.管网.用网1000问 转载于:https://blog.51cto.com/laowu2517/241359

  7. ctf 改变图片高度_每天一分钟,python一点通(opencv的图片处理方法)

    有网友私信小编说,小编的文章很好,讲解的也很详细,但是有些知识点很深奥,对初学者不是很友好,回想小编的文章虽然几乎每条代码都有介绍,但是很多函数没有太详细,小编后期会重启 <每天一分钟,pyth ...

  8. 驾校一点通下载|驾校一点通电脑版下载

    驾校一点通是一个为驾驶初学者神器.汽车驾驶员和驾驶培训机构服务的软件.具有选择驾校,试题练习,教学视频,购车指南等功能,非常的好用. 驾校一点通下载链接 驾校一点通电脑版是一款考驾照必备的电脑软件,主 ...

  9. php一点通,编程一点通

    学好编程最重要的是要细心,学会编程你将成为一个大佬了.编程一点通是一个非常厉害的学习编程的软件,里面有很多技术大佬教导大家进行学习,还有很多关于编程的最新学习方式的资讯都可以免费在线学习,一定不要错过 ...

最新文章

  1. 关于 ListBox 自动换行
  2. ASP编程学习的28个观点
  3. 游戏开发攻略—黑杰克扑克牌
  4. sdut 2127 树-堆结构练习——合并果子之哈夫曼树 优先队列
  5. U盘文件名称变成乱码的解决方法
  6. hprof文件中导出图片
  7. ThreadLocal的好处
  8. (王道408考研操作系统)第二章进程管理-第四节1:死锁相关概念
  9. python发送文件_python:socket传输大文件
  10. Mysql 的utf8和utf8mb4
  11. 基于iOS用CoreImage实现人脸识别
  12. 计算磁偏角 php,如何计算地磁偏角?
  13. php经典实例读后感,读卡耐基《人性的弱点》章节之读后感
  14. 高性能服务器架构拓扑图,某数据中心架构拓扑图.ppt
  15. Excel 设置数字以万为单位显示以更准确地表达数目
  16. 国内外部分源软件镜像站和部分软件官方网站
  17. MOSS Project Server 2007
  18. 非常好听但比较难找的歌曲
  19. 微信小程序傻瓜制作_微信小程序模板制作:手把手教你做一个生鲜小程序
  20. RN实现仿余额宝余额数字翻滚动画特效

热门文章

  1. 职场饭桌:酒桌上的规矩,与领导吃饭如何谈话
  2. Matplotlib 矢量场(quiver)
  3. 【安卓学习之互动直播】 腾讯云直播 1 - 注册/登录/个人信息
  4. vue实现密码显示隐藏、很简单易懂
  5. 鸿蒙车载系统丰田,华为公布三大鸿蒙车载操作系统
  6. 22071班华清远见(上海中心)
  7. 2021年度总结:这一年你过的怎么样?
  8. Java实现家庭记账软件(文本界面)
  9. 你中了微软的圈套么?
  10. 数据智仓功能介绍(一)