生活随笔
收集整理的這篇文章主要介紹了
理解大端和小端
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
教你快速理解大端和小端
學習底層編程或逆向的童鞋,肯定對這兩個名詞并不陌生吧?!今天就給大家介紹一下這兩個概念.
科普: 大端和小端,老外叫?Big-Endian?
和?Little-Endian
,其實指的都是同一個東東!在計算機界,?
表示數據在存儲器中的存放順序.?
不同的?CPU
、操作系統對待數據的存儲方式各有不同,但一般常見的操作系統都是小端,而通訊協議則是大端。 但并不是說系統是小端形式存儲,文件就一定要采用小端的形式,不同的應用程序對于自身數據的存儲方式也各有千秋(自家數據愛咋放咋放,有些還打亂了加密呢),比如: *Adobe PS --?
大端 *BMP --?
小端 *GIF --?
小端 *JPEG --?
大端 *MacPaint --?
大端 *RTF --?
小端 那么小端和大端有什么區別呢?舉個栗子大家就明了了:
比如?0x12345678?
這個數: *
大端法在內存中按字節依次存放為:12 34 56 78 *
小端法在內存中按字節依次存放為:78 56 34 12
解釋: 大端:較高的有效字節存放在較低的存儲器地址,較低的有效字節存放在較高的存儲器地址。 比如整型變量?0x12345678?
占?4?
個字節,那么根據內存地址從小到大它們的存放方式如下: | ?? 數據 ?? | 0x12 | 0x34 | 0x56 | 0x78 |
| 地址 | 0x10000000 | 0x10000001 | 0x10000002 | 0x10000003 |
小端:較高的有效字節存放在較高的的存儲器地址,較低的有效字節存放在較低的存儲器地址。所以整型變量0x12345678?
根據內存地址從小到大它們的存放方式如下: | ?? 數據 ?? | 0x78 | 0x56 | 0x34 | 0x12 |
| 地址 | 0x10000000 | 0x10000001 | 0x10000002 | 0x10000003 |
轉換: 我們發現一個字節是可以存放兩個十六進制的數字的(一個字節最大可以存放的數是?0xFF
),那如果給你一個十進制數(比如?112233
),如何快速地知道它在內存中是如何存放的呢? l??大端法很容易,直接將它轉換成十六進制,然后依次存放即可:0x0001B669 l??小端法則比較麻煩,步驟依次如下: *
轉換成十六進制數(0x0001B669
) *
將八位數字的低四位和高四位互換(0xB6690001
) *
在低四位和高四位中,分別進行兩兩互換(0x69B60100
) 如何檢測你的機器是大端還是小端?
前邊已經說過,?
常見的個人電腦大多數都是使用小端,?
但是我們都是我改變世界的程序猿,?
不妨考慮小如何使用代碼來分辨?
其實不難,?
通過將int
強轉為插入單字節,?
判斷其實儲存位置: #include <stdio.h> int main() { int a = 0x2233; char *b =(char *)&a; if (*b ==0x22) { printf("大端!\n"); } else { printf("小端!\n"); } return 0; } <ignore_js_op>
轉載于:https://www.cnblogs.com/yejianyong/p/7112730.html
總結
以上是生活随笔為你收集整理的理解大端和小端的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。