學習底層編程或逆向的童鞋,肯定對這兩個名詞并不陌生吧?!今天就給大家介紹一下這兩個概念.
科普:
大端和小端,老外叫 Big-Endian 和 Little-Endian,其實指的都是同一個東東在計算機界,表示數據在存儲器中的存放順序。不同的 CPU、操作系統對待數據的存儲方式各有不同,但一般常見的操作系統都是小端,而通訊協議則是大端。
但并不是說系統是小端形式存儲,文件就一定要采用小端的形式,不同的應用程序對于自身數據的存儲方式也各有千秋(自家數據愛咋放咋放,有些還打亂了加密呢),比如:
* Adobe PS -- 大端
* BMP -- 小端
* GIF -- 小端
* JPEG -- 大端
* MacPaint -- 大端
* RTF -- 小端
那么小端和大端有什么區別呢?舉個栗子大家就明了了:
比如 0x12345678 這個數:
* 大端法在內存中按字節依次存放為:12 34 56 78
* 小端法在內存中按字節依次存放為:78 56 34 12
解釋:
大端:較高的有效字節存放在較低的存儲器地址,較低的有效字節存放在較高的存儲器地址。
比如整型變量 0x12345678 占 4 個字節,那么根據內存地址從小到大它們的存放方式如下:
小端:較高的有效字節存放在較高的的存儲器地址,較低的有效字節存放在較低的存儲器地址。所以整型變量 0x12345678 根據內存地址從小到大它們的存放方式如下:
轉換:
我們發現一個字節是可以存放兩個十六進制的數字的(一個字節最大可以存放的數是 0xFF),那如果給你一個十進制數(比如 112233),如何快速地知道它在內存中是如何存放的呢?
l 大端法很容易,直接將它轉換成十六進制,然后依次存放即可:0x0001B669
l 小端法則比較麻煩,步驟依次如下:
* 轉換成十六進制數(0x0001B669)
* 將八位數字的低四位和高四位互換(0xB6690001)
* 在低四位和高四位中,分別進行兩兩互換(0x69B60100)
如何檢測你的機器是大端還是小端?
前邊已經說過,常見的個人電腦大多數都是使用小端,但是我們都是我改變世界的程序猿,不妨考慮小如何使用代碼來分辨?
其實不難,通過將int強轉為插入單字節,判斷其實儲存位置:
#include
int main()
{
int a = 0x2233;
char *b = (char *)&a;
if (*b == 0x22)
{
printf("大端!\n");
}
else
{
printf("小端!\n");
}
return 0;
}
彩蛋
大端和小端,事實上是來源于 Jonathan Swift 的《格列佛游記》一書。
以下是 Jonathan Swift 在 1726 年關于大小端之爭歷史的描述:
……我下面要告訴你的是,Lilliput 和 Blefuscu 這兩大強國在過去 36 個月里一直在苦戰。戰爭開始是由于以下的原因:我們大家都認為,吃雞蛋前,原始的方法是打破雞蛋較大的一端,可是當今皇帝的祖父小時候吃雞蛋,一次按古法打雞蛋時碰巧將一個手指弄破了,因此他的父親,當時的皇帝,就下了一道敕令,命令全體臣民吃雞蛋時打破雞蛋較小的一端,違令者重罰。老百姓們對這項命令極為反感。歷史告訴我們,由此曾發生過 6 次叛亂,其中一個皇帝送了命,另一個丟了王位。這些叛亂大多都是由 Blefuscu 的國王大臣們煽動起來的。叛亂平息后,流亡的人總是逃到那個帝國去尋救避難。據估計,先后幾次有 11000 人情愿受死也不肯去打破雞蛋較小的一端。關于這一爭端,曾出版過幾百本大部著作,不過大端派的書一直是受禁的,法律也規定該派的任何人不得做官……
在他那個時代,Swift 是在諷刺英國(Lilliput)和法國(Blefuscu)之間持續的沖突。Danny Cohen,一位網絡協議的早期開創者,第一次使用這兩個術語來指代字節順序,后來這個術語就被廣泛地接納了。
-
編程
+關注
關注
88文章
3639瀏覽量
94031
原文標題:教你快速理解大端和小端
文章出處:【微信號:C_Expert,微信公眾號:C語言專家集中營】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
cpu的大端模式小端模式優劣對比
![cpu的<b class='flag-5'>大端</b>模式小<b class='flag-5'>端</b>模式優劣對比](https://file1.elecfans.com//web2/M00/A6/DF/wKgZomUMQP6AEc8RAAArMlXsScE830.png)
ZCAN PRO解析的DBC Singal 起始位與XNET解析的起始位不同;解析的信號不符合大端邏輯
DSP 小端轉大端問題 有償咨詢
LabVIEW 小端序和大端序區別
運行平臺的大端小端問題及判斷
如何辨別U盤和內存卡?兩者概念上的區別是什么
關于大端模式與小端模式的介紹
![關于<b class='flag-5'>大端</b>模式與小<b class='flag-5'>端</b>模式的介紹](https://file.elecfans.com/web1/M00/58/29/pIYBAFtT6UCAX-8oAAApYpfpCy8052.jpg)
嵌入式開發中CPU大端和小端模式的詳細資料和程序分析講解
![嵌入式開發中CPU<b class='flag-5'>大端</b>和小<b class='flag-5'>端</b>模式的詳細資料和程序分析講解](https://file.elecfans.com/web1/M00/91/03/o4YBAFzP4aGAHA6cAA3ZyqI5BlY781.png)
測試MCU是大端模式還是小端模式
![測試MCU是<b class='flag-5'>大端</b>模式還是小<b class='flag-5'>端</b>模式](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評論