Big Endian 和 Little Endian
談到位元組序的問題,必然牽涉到兩大CPU派系。那就是Motorola的PowerPC系列CPU和Intel的x86系列CPU。PowerPC系列採用big endian方式儲存資料,而x86系列則採用little endian方式儲存資料。那麼究竟什麼是big endian,什麼又是 little endian呢? 其實big endian是指低地址存放最高有效位元組(MSB),而little endian則是低地址存放最低有效位元組(LSB)。 用文字說明可能比較抽象,下面用影象加以說明。比如數字0x12345678在兩種不同位元組序CPU中的儲存順序如下所示:
Big Endian 低地址 高地址 -----------------------------------------> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | 12 | 34 | 56 | 78 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Little Endian 低地址 高地址 -----------------------------------------> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | 78 | 56 | 34 | 12 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
從上面兩圖可以看出,採用big endian方式儲存資料是符合我們人類的思維習慣的。而little endian,[email protected]#$%^&*,見鬼去吧 -_-||| 為什麼要注意位元組序的問題呢?你可能這麼問。當然,如果你寫的程式只在單機環境下面執行,並且不和別人的程式打交道,那麼你完全可以忽略位元組序的存在。但是,如果你的程式要跟別人的程式產生互動呢?在這裡我想說說兩種語言。C/C++語言編寫的程式裡資料儲存順序是跟編譯平臺所在的CPU相關的,而 JAVA編寫的程式則唯一採用big endian方式來儲存資料。試想,如果你用C/C++語言在x86平臺下編寫的程式跟別人的JAVA程式互通時會產生什麼結果?就拿上面的0x12345678來說,你的程式傳遞給別人的一個數據,將指向0x12345678的指標傳給了JAVA程式,由於JAVA 採取big endian方式儲存資料,很自然的它會將你的資料翻譯為0x78563412。什麼?竟然變成另外一個數字了?是的,就是這種後果。因此,在你的C程式傳給JAVA程式之前有必要進行位元組序的轉換工作。 無獨有偶,所有網路協議也都是採用big endian的方式來傳輸資料的。所以有時我們也會把big endian方式稱之為網路位元組序。當兩臺採用不同位元組序的主機通訊時,在傳送資料之前都必須經過位元組序的轉換成為網路位元組序後再進行傳輸。ANSI C中提供了下面四個轉換位元組序的巨集。 ·BE和LE一文的補完 我在8月9號的《Big Endian和Little Endian》一文中談了位元組序的問題,原文見上面的超級連結。可是有朋友仍然會問,CPU儲存一個位元組的資料時其位元組內的8個位元之間的順序是否也有big endian和little endian之分?或者說是否有位元序的不同? 實際上,這個位元序是同樣存在的。下面以數字0xB4(10110100)用圖加以說明。 Big Endian msb lsb ----------------------------------------------> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | 1 | 0 | 1 | 1 | 0 | 1 | 0 | 0 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ Little Endian lsb msb ----------------------------------------------> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 實際上,由於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從而發生混亂。
相關推薦
位元組序:Big Endian 和 Little Endian
最近碰到了node.js中的buf.readUInt16LE(offset[, noAssert])方法: 根據指定的偏移量,使用特殊的 endian 位元組序格式讀取一個無符號 16 位整數。若引數 noAssert 為 true 將不會驗證 offset
Big Endian 和 Little Endian
談到位元組序的問題,必然牽涉到兩大CPU派系。那就是Motorola的PowerPC系列CPU和Intel的x86系列CPU。PowerPC系列採用big endian方式儲存資料,而x86系列則採用little endian方式儲存資料。那麼究竟什麼是big
判斷CPU模式是大端還是小段(big-Endian和little-Endian)
一、大端模式和小端模式的起源 關於大端小端名詞的由來,有一個有趣的故事,來自於Jonathan Swift的《格利佛遊記》:Lilliput和Blefuscu這兩個強國在過去的36個月中一直在苦戰。戰爭的原因:大家都知道,吃雞蛋的時候,原始的方法是打破雞蛋較
關於Big Endian 和 Little Endian
-_-||| 為什麼要注意位元組序的問題呢?你可能這麼問。當然,如果你寫的程式只在單機環境下面執行,並且不和別人的程式打交道,那麼你完全可以忽略位元組序的存在。但是,如果你的程式要跟別人的程式產生互動呢?在這裡我想說說兩種語言。C/C++語言編寫的程式裡資料儲存順序是跟編譯平臺所在的CPU相關的,而
詳解Big-Endian和Little-Endian,大端模式和小端模式
詳解大端模式和小端模式 一、大端模式和小端模式的起源 關於大端小端名詞的由來,有一個有趣的故事,來自於Jonathan Swift的《格利佛遊記》:Lilliput和Blefuscu這兩個強國在過去的36個月中一直在苦戰。戰爭的原因:大家都知道,吃雞蛋
Big Endian 和 Little Endian 詳解
一、Endian的起源 在各種計算機體系結構中,對於位元組、字等的儲存機制有所不同,因而引發了計算機通訊領域中一個很重要的問題,即通訊雙方交流的資訊單元(位元、位元組、字、雙字等等)應該以什麼樣的順序進行傳送。如果不達成一致的規則,通訊雙方將無法進行正確的編/
【C/C++】Big Endian 和 Little Endian記憶體對齊
Big Endian 和 Little Endian記憶體對齊 由於目前的工作需要,所以學習了一下計算機記憶體對齊的相關知識,先介紹計算機的儲存方式:Big Endian與Little Endian: Big Endian 即資料的高位在低地址,地位在
大端和小端(big endian little endian)
讀寫 pue 處理器 bsp 網絡 做的 tdi har power 一、大端和小端的問題 對於整型、長整型等數據類型,Big endian 認為第一個字節是最高位字節(按照從低地址到高地址的順序存放數據的高位字節到低位字節);而 Little endian 則相反,它認為
大端和小端(Big endian and Little endian)
tro big ttl class erp 順序 通過 網絡 rpc 1.大端和小端的問題 ? 對於整型、長整型等數據類型,Big endian 人為第一個字節是最高位字節(按照從低地址到高地址的順序存放數據的高位字節到低位字節),而 Little endian 則相反,它
判斷機器是big-endian、little-endian
訪問 都是 進制 內容 打印 應該 變量 little code 聯合體union和大小端(big-endian、little-endian):下邊示範了一種用途,代表四個含義的四個變量,但是可以用一個int來操作,直接int賦值,無論內存訪問(指針大小的整數倍,訪問才有
判斷計算機位元組儲存順序的方法(Big-endian或Little-endian)
little endian和big endian是表示計算機位元組順序的兩種格式,所謂的位元組順序指的是長度跨越多個位元組的資料的存放形式. 假設從地址0x00000000開始的一個字中儲存有資料0x1234abcd,那麼在兩種不同的
ORACLE的redo檔案在不同機器上儲存是否使用big-endian還是little-endian的問題
在解析ORACLE的dbf檔案的時候,發現在不同的機器臺上,儲存使用的位元組序並不一樣. 今天看PostgreSQL 9.6.1更新版本釋出說明的時候,看到這塊有相關的描述: pg_upgrade在大端機器上的問題 在大端機器(例如許多非Intel CPU架構)上,pg_
位元組順序:高位優先(big-endian)和低位優先(little-endian)
@[TOC](位元組順序:高位優先(big-endian)和低位優先(little-endian)) 網路位元組序: MSB 高位元組前存法 Most Significant Bit (Big Edian) 主機位元組序: LSB 低位元組前存法 Lest
需要注意位元組序的大端(big endian)和小端(little endian)的幾種情景
大端(big endian):在記憶體中,按照從最低有效位元組到最高有效位元組的順序儲存物件,即資料的高位元組,儲存在記憶體的低地址中,而資料的低位元組,儲存在記憶體的高地址中。 小端(littl
對整數和浮點數儲存,little-endian和big-endian位元組順序,以及位運算的一點回顧
對問題的一些理解 1.位運算及其相關運算 位運算 &,|,^,~,<<,>>,+,! 用 異或^ 可以交換兩個變數,不需要中間變數 a = a ^ b; // a = 0000 1111 b = b ^ a; // b = 0000
位元組序——大端(Big Endian)和小端(Little Endian)
每次碰到這個問題都需要現查資料,腦子不夠用啊,索性就把它的來龍去脈寫下來,加深一下印象。 1. 位元組序問題的存在原因 自計算機採用byte作為儲存單位起,位元組序就是一個有爭議的話題。這是因為我們通常處理的資料都是多位元組資料,比如c語言中一個型別為int的變數,在記憶體
大端位元組序和小端位元組序問題(big-endian & little-endian)
所謂的大端模式(Big-endian),是指資料的低位(就是權值較小的後面那幾位)儲存在記憶體的高地址中,而資料的高位,儲存在記憶體的低地址中,這樣的儲存模式有點兒類似於把資料當作字串順序處理:地址由小向大增加,而資料從高位往低位放; 所謂的小端模式(Little-endian
小端格式和大端格式(Little-Endian&Big-Endian)
不同的CPU有不同的位元組序型別,這些位元組序是指整數在記憶體中儲存的順序。 最常見的有兩種: 1. Little-endian:將低序位元組儲存在起始地址(低位編址) 2. Big-endian:將高序位元組儲存在起始地址(高位編址) LE(little-endian): 最符合人的思維的位元組
推斷CPU 是小端存儲(Little endian)還是大端存儲(Big endian)模式
art div 版本 ack 一個 fine name clas char 第一個版本號: //return true in big-endian machines bool check_big_endian1() { int a = 0; int *p = &a
徹底搞懂字元編碼(unicode,mbcs,utf-8,utf-16,utf-32,big endian,little endian...)
最近有一些朋友常問我一些亂碼的問題,和他們交流過程中,發現這個編碼的相關知識還真是雜亂不堪,不少人對一些 知識理解似乎也有些偏差,網上百度,google的內容,也有不少以訛傳訛,根本就是錯誤的(例如說 unicode編碼是兩 個位元組),各種軟體讓你選擇編碼的時候,常