一、Endian的起源
在各种计算机体系结构中,对于字节、字等的存储机制有所不同,因而引发了计算机通信领域中一个很重要的问题,即通信双方交流的信息单元(比特、字节、字、双字等等)应该以什么样的顺序进行传送。如果不达成一致的规则,通信双方将无法进行正确的编/译码从而导致通信失败。

1980年,Danny Cohen在其著名的论文”On Holy Wars and a Plea for Peace”中为了平息一场关于在消息中字节该以什么样的顺序进行传送的争论而引用了该词。该文中,Cohen非常形象贴切地把支持从一个消息序列的最高位开始传送的那伙人叫做Big-Endians,支持从最低位开始传送的相对应地叫做Little-Endians。此后Endian这个词便随着这篇论文而被广为采用。

二、字节序之Little-Endian&Big-Endian
首先,明确一点,咱们接触到的物理单元最小都是字节;因此,无论是big endian,还是little endian,都是针对多个字节的序列而言的;当然,在通信领域中,这里往往是bit,不过原理也是类似的,稍后我会介绍。

对于字节序列的存储格式,目前有两大阵营,那就是Motorola的PowerPC系列CPU和Intel的x86系列CPU。PowerPC系列采用big endian方式存储数据,而x86系列则采用little endian方式存储数据。那么究竟什么是big endian,什么又是little endian呢?

1)Little-endian:将低序字节存储在起始地址(低位编址)
2)Big-endian:将高序字节存储在起始地址(高位编址)

举个例子:
如果我们将0x1234abcd写入到以0x0000开始的内存中,则结果为;

address big-endian little-endian
0x0000 0x12 0xcd
0x0001 0x34 0xab
0x0002 0xab 0x34
0x0003 0xcd 0x12

注:每个地址存1个字节,2位16进制数是1个字节(0xFF=11111111);

为什么要注意字节序的问题呢?你可能这么问。当然,如果你写的程序只在单机环境下面运行,并且不和别人的程序打交道,那么你完全可以忽略字节序的存在。

但是,如果你的程序要跟别人的程序产生交互呢?在这里我想说说两种语言。C/C++语言编写的程序里数据存储顺序是跟编译平台所在的CPU相关的,而JAVA编写的程序则唯一采用big endian方式来存储数据。

试想,如果你用C/C++语言在x86平台下编写的程序跟别人的JAVA程序互通时会产生什么结果?就拿上面的0x12345678来说,你的程序传递给别人的一个数据,将指向0x12345678的指针传给了JAVA程序,由于JAVA采取big endian方式存储数据,很自然的它会将你的数据翻译为0x78563412。什么?竟然变成另外一个数字了?是的,就是这种后果。因此,在你的C程序传给JAVA程序之前有必要进行字节序的转换工作。

无独有偶,所有网络协议也都是采用big endian的方式来传输数据的。所以有时我们也会把big endian方式称之为网络字节序。当两台采用不同字节序的主机通信时,在发送数据之前都必须经过字节序的转换成为网络字节序后再进行传输。

目前应该little endian是主流,因为在数据类型转换的时候(尤其是指针转换)不用考虑地址问题。

三、比特序之Little-Endian&Big-Endian
可是有朋友仍然会问,CPU存储一个字节的数据时其字节内的8个比特之间的顺序是否也有big endian和little endian之分?或者说是否有比特序的不同?

实际上,这个比特序是同样存在的。下面以数字0xB4(10110100)用图加以说明。

MSB的意思是:全称为Most Significant Bit,在二进制数中属于最高有效位,MSB是最高加权位,与十进制数字中最左边的一位类似。

LSB的意思是:全称为Least Significant Bit,在二进制数中意为最低有效位,一般来说,MSB位于二进制数的最左侧,LSB位于二进制数的最右侧。

Big Endian
msb------------------------>lsb
±±±±±±±±±±±±±±±±±±±±+
| 1 | 0 | 1 | 1 | 0 | 1 | 0 | 0 |
±±±±±±±±±±±±±±±±±±±±+
1
2
3
4
Little Endian
lsb-------------------------->msb
±±±±±±±±±±±±±±±±±±±±+
| 0 | 0 | 1 | 0 | 1 | 1 | 0 | 1 |
±±±±±±±±±±±±±±±±±±±±+
1
2
3
4
实际上,由于CPU存储数据操作的最小单位是一个字节,其内部的比特序是什么样对我们的程序来说是一个黑盒子。也就是说,你给我一个指向0xB4这个数的指针,对于big endian方式的CPU来说,它是从左往右依次读取这个数的8个比特;而对于little endian方式的CPU来说,则正好相反,是从右往左依次读取这个数的8个比特。而我们的程序通过这个指针访问后得到的数就是0xB4,字节内部的比特序对于程序来说是不可见的,其实这点对于单机上的字节序来说也是一样的。

那可能有人又会问,如果是网络传输呢?会不会出问题?是不是也要通过什么函数转换一下比特序?嗯,这个问题提得很好。假设little endian方式的CPU要传给big endian方式CPU一个字节的话,其本身在传输之前会在本地就读出这个8比特的数,然后再按照网络字节序的顺序来传输这8个比特,这样的话到了接收端不会出现任何问题。而假如要传输一个32比特的数的话,由于这个数在littel endian方存储时占了4个字节,而网络传输是以字节为单位进行的,little endian方的CPU读出第一个字节后发送,实际上这个字节是原数的LSB,到了接收方反倒成了MSB从而发生混乱。

扩展:
https://blog.csdn.net/joenqc/article/details/71173382

URL编解码、Big Endian和Little Endian相关推荐

  1. PHP中文URL编解码(urlencode()rawurlencode()

    PHP中文URL编解码(urlencode()rawurlencode() PHP中对于URL进行编码,可以使用 urlencode() 或者 rawurlencode(),二者的区别是前者把空格编码 ...

  2. javascript:URL编解码和父子窗口交互

    简单的URL编解码 URL编码使用javascript的escape实现,在后台也可用System.Web.HttpUtility.UrlEncodeUnicode()实现. 在解码时使用javasc ...

  3. 小工具发布(2008-01-25更新,HTML、URL编解码工具)

    (2008-01-25)HTML.URL编解码工具 [介绍文章][访问该工具]

  4. MSDK手Q邀请透传参数问题:url编解码与base64编解码

    最近做MSDK手Q的邀请功能,遇到一个坑,手Q结构化消息分享功能接口如下: /*** @param scene 标识发送手Q会话或者Qzone* eQQScene.QQScene_QZone: 分享到 ...

  5. 命令行实现URL编解码

    命令行实现URL编解码 文章目录 命令行实现URL编解码 1. 实现 2. 原理 2.1 url 的编码规则 2.2 printf 附:参考资料 1. 实现 这里的脚本在 GNU bash, vers ...

  6. Jva编解码,加密工具类大全(Base64编解码,URL 编解码,sha56_Hmac加密,MD5对字符串进行加密,java自带类实现SHA-256方式加密)

    Base64编解码 /*** Base64编码.*/public static String encodeBase64(byte[] input) {return new String(Base64. ...

  7. Base64、Unicode、URL编解码加解密

    由IFTC(工作室链接:https://shequ.codemao.cn/work_shop/10892)制作的编解码加解密的APP 下载链接:https://creation.codemao.cn/ ...

  8. 常见加密解密和URL编解码

    常见加密解密和URL编解码 Base64 概念: 基于64个可打印字符,用于表示二进制数据,使用的字符包括大小写拉丁字母各26个.数字10个.加号+和斜杠/,共64个字符,等号=用来作为后缀用途 2^ ...

  9. URLEncoder 、URLDecoder 对 URL 编解码,HttpURLConnection 文件下载

    目录 URLEncoder  编码 URLDecoder 解码 URL 空格问题 与 HttpURLConnection 文件下载 URLEncoder  编码 1.public class URLE ...

最新文章

  1. Python黑帽编程2.4 流程控制
  2. Fedora下校园网上网指南(802.1xDrcom)
  3. 交换机调试工具_工业以太网交换机安装流程图解
  4. 第三天2017/03/30(上午:二级指针的(输入)内存模型:(共三种模型))
  5. android按钮进度动画,android – 在按钮后面放置一个进度条
  6. 【Python】学习笔记总结2(Python面向对象)
  7. 一键了结CUP100%问题
  8. oracle 触发器
  9. mysql使用between..and 查询日期范围注意事项
  10. 普适计算机的应用领域有哪些,2017年度计算机科学各领域热点词汇
  11. ETC因背胶问题脱落,如何重新激活?
  12. 纳什叫上林书豪,投了一家AI篮球训练公司
  13. windows server 2012将计算机图标添加到桌面(图文教程)(转)
  14. 【控制】反馈控制入门,PID控制
  15. Java面试之爱立信
  16. 【数码复印新生态】东芝泰格强势支持统信UOS
  17. FTP,SFTP,FTPS,TF区别
  18. 常用希腊字母与英文字母对照表;希腊字母中文发音
  19. 排队问题解题思路_有关排队问题的排列组合题解法举例
  20. 【推荐】1657- 灵活可扩展,2023年值得尝试的13款富文本编辑器

热门文章

  1. java语言中的浮点型数据分为,Java语言中的浮点型数据根据数据存储长度和数值精度的不同,进一步分为float型和double型,其中dou...
  2. 怎样连接mysql文件_如何连接MYSQL数据库?
  3. 揭开不一样的世界,这5部纪录片绝对不能错过!
  4. 亲一下就搞定的事,绝不花钱解决!
  5. PS比狠大赛!看看谁家的照片更丑!
  6. 如何机智的弄坏一台电脑?
  7. 进军人工智能,数学基础很重要?
  8. mysql 调用未定义函数_php – Wierd和Annoying错误:调用未定义的函数mysql_query()[复制]...
  9. emacs python_Emacs之Python编程环境配置 - elpy
  10. 频谱分析幅值单位_案例分享丨某水泥厂入窑斗提减速机不对中故障分析及处理...