一杯清酒邀明月
天下本无事,庸人扰之而烦耳。

  大端模式和小端模式是计算机中经常涉及到的两种字节序,也有大端对齐、小端对齐、大尾、小尾等叫法。

一、起源

  说起这两种模式,就不得不提一下大端(Big-endian)和小端(Little-endian)这两个英文上的起源。

  “endian”一词来源于乔纳森·斯威夫特的小说格列佛游记。Lilliput和Blefuscu这两个强国在过去的36个月中一直在苦战。战争的原因:大家都知道,吃鸡蛋的时候,原始的方法是打破鸡蛋较大的一端(Big-End),可以那时的皇帝的祖父由于小时侯吃鸡蛋,按这种方法把手指弄破了,因此他的父亲,就下令,命令所有的子民吃鸡蛋的时候,必须先打破鸡蛋较小的一端(Little-End),违令者重罚。然后老百姓对此法令极为反感,期间发生了多次叛乱,其中一个皇帝因此送命,另一个丢了王位,产生叛乱的原因就是另一个国家Blefuscu的国王大臣煽动起来的,叛乱平息后,就逃到这个帝国避难。据估计,先后几次有11000余人情愿死也不肯去打破鸡蛋较小的端吃鸡蛋。这个其实讽刺当时英国和法国之间持续的冲突。其中两种方法吃鸡蛋的人分别被称为Big-endians和Little-endians。1980年,Danny Cohen在其著名的论文”On Holy Wars and a Plea for Peace”中,为平息一场关于字节该以什么样的顺序传送的争论,而引用了该词。

二、存储模式

  接下来就说说为什么会有字节序的问题。

  计算机在存储数据的时候,是以字节(byte)为基本单位来存储的,因此存储单字节类型的数据(比如char)不存在字节序的问题。但存储多字节的数据的时候(比方说4字节的int变量),就涉及到了以一个什么样的顺序来存储。下面举例来说明大端和小端的存储方式。

  定义变量 unsigned long long a=0x1122334455667788

  变量a是一个64位的无符号整数,共需要8个字节来存储,那么在两种模式下是如何存储的呢?

||--1--||--2--||--3--||--4--||--5--||--6--||--7--||--8--|| 地址

|| 11 || 22 || 33 || 44 || 55 || 66 || 77 || 88 || 大端模式

|| 88 || 77 || 66 || 55 || 44 || 33 || 22 || 11 || 小端模式

  从中很容易可以看出各自的存储特点。

三、转换函数及头文件

  大小端API头文件: 

#include <QtEndian>

  常见API如下,详见头文件的描述

  • qToBigEndian(T source)
  • qFromBigEndian(T source)
  • qToLittleEndian(T source)
  • qFromLittleEndian(T source)
  • qToBigEndian(T src, void *dest)
  • qToLittleEndian(T src, void *dest)

 

posted on 2024-03-29 15:09  一杯清酒邀明月  阅读(221)  评论(0编辑  收藏  举报