RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

大端和小端概念、區(qū)別、轉(zhuǎn)換以及辨別方法解析

C語(yǔ)言專(zhuān)家集中營(yíng) ? 來(lái)源:未知 ? 作者:伍文輝 ? 2018-02-03 14:27 ? 次閱讀

學(xué)習(xí)底層編程或逆向的童鞋,肯定對(duì)這兩個(gè)名詞并不陌生吧?!今天就給大家介紹一下這兩個(gè)概念.

科普

大端和小端,老外叫 Big-Endian 和 Little-Endian,其實(shí)指的都是同一個(gè)東東在計(jì)算機(jī)界,表示數(shù)據(jù)在存儲(chǔ)器中的存放順序。不同的 CPU操作系統(tǒng)對(duì)待數(shù)據(jù)的存儲(chǔ)方式各有不同,但一般常見(jiàn)的操作系統(tǒng)都是小端,而通訊協(xié)議則是大端。

但并不是說(shuō)系統(tǒng)是小端形式存儲(chǔ),文件就一定要采用小端的形式,不同的應(yīng)用程序?qū)τ谧陨頂?shù)據(jù)的存儲(chǔ)方式也各有千秋(自家數(shù)據(jù)愛(ài)咋放咋放,有些還打亂了加密呢),比如:

* Adobe PS -- 大端

* BMP -- 小端

* GIF -- 小端

* JPEG -- 大端

* MacPaint -- 大端

* RTF -- 小端

那么小端和大端有什么區(qū)別呢?舉個(gè)栗子大家就明了了:

比如 0x12345678 這個(gè)數(shù):

* 大端法在內(nèi)存中按字節(jié)依次存放為:12 34 56 78

* 小端法在內(nèi)存中按字節(jié)依次存放為:78 56 34 12

解釋?zhuān)?/p>

大端:較高的有效字節(jié)存放在較低的存儲(chǔ)器地址,較低的有效字節(jié)存放在較高的存儲(chǔ)器地址。

比如整型變量 0x12345678 占 4 個(gè)字節(jié),那么根據(jù)內(nèi)存地址從小到大它們的存放方式如下:

大端和小端概念、區(qū)別、轉(zhuǎn)換以及辨別方法解析

小端:較高的有效字節(jié)存放在較高的的存儲(chǔ)器地址,較低的有效字節(jié)存放在較低的存儲(chǔ)器地址。所以整型變量 0x12345678 根據(jù)內(nèi)存地址從小到大它們的存放方式如下:

大端和小端概念、區(qū)別、轉(zhuǎn)換以及辨別方法解析

轉(zhuǎn)換:

我們發(fā)現(xiàn)一個(gè)字節(jié)是可以存放兩個(gè)十六進(jìn)制的數(shù)字的(一個(gè)字節(jié)最大可以存放的數(shù)是 0xFF),那如果給你一個(gè)十進(jìn)制數(shù)(比如 112233),如何快速地知道它在內(nèi)存中是如何存放的呢?

l 大端法很容易,直接將它轉(zhuǎn)換成十六進(jìn)制,然后依次存放即可:0x0001B669

l 小端法則比較麻煩,步驟依次如下:

* 轉(zhuǎn)換成十六進(jìn)制數(shù)(0x0001B669)

* 將八位數(shù)字的低四位和高四位互換(0xB6690001)

* 在低四位和高四位中,分別進(jìn)行兩兩互換(0x69B60100)

如何檢測(cè)你的機(jī)器是大端還是小端?

前邊已經(jīng)說(shuō)過(guò),常見(jiàn)的個(gè)人電腦大多數(shù)都是使用小端,但是我們都是我改變世界的程序猿,不妨考慮小如何使用代碼來(lái)分辨?

其實(shí)不難,通過(guò)將int強(qiáng)轉(zhuǎn)為插入單字節(jié),判斷其實(shí)儲(chǔ)存位置:

#include

int main()

{

int a = 0x2233;

char *b = (char *)&a;

if (*b == 0x22)

{

printf("大端!\n");

}

else

{

printf("小端!\n");

}

return 0;

}

彩蛋

大端和小端,事實(shí)上是來(lái)源于 Jonathan Swift 的《格列佛游記》一書(shū)。

以下是 Jonathan Swift 在 1726 年關(guān)于大小端之爭(zhēng)歷史的描述:

……我下面要告訴你的是,Lilliput 和 Blefuscu 這兩大強(qiáng)國(guó)在過(guò)去 36 個(gè)月里一直在苦戰(zhàn)。戰(zhàn)爭(zhēng)開(kāi)始是由于以下的原因:我們大家都認(rèn)為,吃雞蛋前,原始的方法是打破雞蛋較大的一端,可是當(dāng)今皇帝的祖父小時(shí)候吃雞蛋,一次按古法打雞蛋時(shí)碰巧將一個(gè)手指弄破了,因此他的父親,當(dāng)時(shí)的皇帝,就下了一道敕令,命令全體臣民吃雞蛋時(shí)打破雞蛋較小的一端,違令者重罰。老百姓們對(duì)這項(xiàng)命令極為反感。歷史告訴我們,由此曾發(fā)生過(guò) 6 次叛亂,其中一個(gè)皇帝送了命,另一個(gè)丟了王位。這些叛亂大多都是由 Blefuscu 的國(guó)王大臣們煽動(dòng)起來(lái)的。叛亂平息后,流亡的人總是逃到那個(gè)帝國(guó)去尋救避難。據(jù)估計(jì),先后幾次有 11000 人情愿受死也不肯去打破雞蛋較小的一端。關(guān)于這一爭(zhēng)端,曾出版過(guò)幾百本大部著作,不過(guò)大端派的書(shū)一直是受禁的,法律也規(guī)定該派的任何人不得做官……

在他那個(gè)時(shí)代,Swift 是在諷刺英國(guó)(Lilliput)和法國(guó)(Blefuscu)之間持續(xù)的沖突。Danny Cohen,一位網(wǎng)絡(luò)協(xié)議的早期開(kāi)創(chuàng)者,第一次使用這兩個(gè)術(shù)語(yǔ)來(lái)指代字節(jié)順序,后來(lái)這個(gè)術(shù)語(yǔ)就被廣泛地接納了。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 編程
    +關(guān)注

    關(guān)注

    88

    文章

    3614

    瀏覽量

    93685

原文標(biāo)題:教你快速理解大端和小端

文章出處:【微信號(hào):C_Expert,微信公眾號(hào):C語(yǔ)言專(zhuān)家集中營(yíng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    cpu的大端模式小模式優(yōu)劣對(duì)比

    關(guān)于大端名詞的由來(lái),有一個(gè)有趣的故事,來(lái)自于Jonathan Swift的《格利佛游記》:Lilliput和Blefuscu這兩個(gè)強(qiáng)國(guó)在過(guò)去的36個(gè)月中一直在苦戰(zhàn)。戰(zhàn)爭(zhēng)的原因:大家都知道,吃雞蛋的時(shí)候,原始的方法是打破雞蛋較
    的頭像 發(fā)表于 11-08 11:10 ?1.2w次閱讀
    cpu的<b class='flag-5'>大端</b>模式小<b class='flag-5'>端</b>模式優(yōu)劣對(duì)比

    請(qǐng)問(wèn)STM32(MDK)默認(rèn)大端還是小?

    STM32(MDK)默認(rèn)大端還是小
    發(fā)表于 04-30 06:02

    ZCAN PRO解析的DBC Singal 起始位與XNET解析的起始位不同;解析的信號(hào)不符合大端邏輯

    上圖中的DBC文件使用記事本打開(kāi),Data_Field信號(hào),起始位為23,長(zhǎng)度為48,大端方式存儲(chǔ);(按照這個(gè)方式存儲(chǔ),明顯已經(jīng)溢出) 上圖為該信號(hào)在ZCANPRO軟件中打開(kāi),解析的起始位為23
    發(fā)表于 10-18 13:53

    DSP 小轉(zhuǎn)大端問(wèn)題 有償咨詢

    如題所示,我們以前是做算法的,用的都是dsp默認(rèn)的庫(kù)實(shí)現(xiàn)算法,沒(méi)有關(guān)注大端問(wèn)題?,F(xiàn)在算法移交后,甲方說(shuō)他們是大端,我們是小的庫(kù),沒(méi)法用,我們嘗試著在
    發(fā)表于 12-04 08:56

    大端序與小

    嵌入式之什么是大端序與小序朱有鵬1.大小模式11.1、什么是大小模式大端模式(big endian)和小
    發(fā)表于 12-13 17:06

    求解釋大端和小概念和及區(qū)別

    麻煩專(zhuān)家用概括的語(yǔ)言解釋一下這兩個(gè)概念以及他們的區(qū)別吧,找文檔沒(méi)有找到相關(guān)資料。
    發(fā)表于 12-27 11:14

    LabVIEW 小序和大端區(qū)別

    LabVIEW 小序和大端區(qū)別看到在一些范例程序中出現(xiàn)了小序和大端序,這里的的字節(jié)序表示什么意思?解答: endian表示的是多字節(jié)二
    發(fā)表于 04-22 19:56

    ARM芯片是小還是大端

    ARM芯片是小還是大端?哪位大佬知道,能否給說(shuō)明一下。ARM大小格式是由編譯器決定?還是CPU決定?
    發(fā)表于 06-30 17:59

    keil怎么設(shè)置大端和小模式?

    keil怎么設(shè)置大端和小模式,用于stm32
    發(fā)表于 09-21 07:46

    運(yùn)行平臺(tái)的大端問(wèn)題及判斷

    大端和小字節(jié)序的問(wèn)題在網(wǎng)絡(luò)中以及在不同的操作系統(tǒng)的兼容性中是一個(gè)比較大的問(wèn)題。它關(guān)系到不同操作系統(tǒng)和網(wǎng)絡(luò)傳輸是否能夠保證數(shù)據(jù)的語(yǔ)義正確性。
    發(fā)表于 08-25 17:54 ?914次閱讀

    如何辨別U盤(pán)和內(nèi)存卡?兩者概念上的區(qū)別是什么

    本文首先介紹了辨別U盤(pán)和內(nèi)存卡方法概念上的區(qū)別,其次對(duì)u盤(pán)不同格式優(yōu)缺點(diǎn)進(jìn)行了分析,最后介紹了內(nèi)存卡主要分類(lèi)及手機(jī)內(nèi)存卡的作用。
    發(fā)表于 05-14 10:00 ?4.7w次閱讀

    關(guān)于大端模式與小模式的介紹

    數(shù)據(jù)組織是指數(shù)據(jù)的傳送順序。目前常見(jiàn)的32為處理器的數(shù)據(jù)總線粒度為1字節(jié),在傳送時(shí),一個(gè)32位數(shù)據(jù)的最高字節(jié)可以放在數(shù)據(jù)總線的最低8位傳送,也可以放在數(shù)據(jù)總線的最高8位傳送,因此出現(xiàn)了大端和小兩種數(shù)據(jù)組織方法
    的頭像 發(fā)表于 07-22 10:16 ?6419次閱讀
    關(guān)于<b class='flag-5'>大端</b>模式與小<b class='flag-5'>端</b>模式的介紹

    嵌入式開(kāi)發(fā)中CPU大端和小模式的詳細(xì)資料和程序分析講解

    在嵌入式開(kāi)發(fā)中,大端(Big-endian)和小(Little-endian)是一個(gè)很重要的概念。
    發(fā)表于 05-06 18:23 ?0次下載
    嵌入式開(kāi)發(fā)中CPU<b class='flag-5'>大端</b>和小<b class='flag-5'>端</b>模式的詳細(xì)資料和程序分析講解

    測(cè)試MCU是大端模式還是小模式

    1、在編程開(kāi)發(fā)過(guò)程中必須要知道你的MCU是大端模式還是小模式。2、通過(guò)以下代碼就能輕松知道是大端模式還是小模式。3、廢話不多說(shuō),直接上代碼。#include "stdio.h&qu
    發(fā)表于 11-25 19:21 ?16次下載
    測(cè)試MCU是<b class='flag-5'>大端</b>模式還是小<b class='flag-5'>端</b>模式

    C語(yǔ)言 大端判斷代碼

    圖1:小法(左)、大端法(右)將數(shù)據(jù)最低位存儲(chǔ)在內(nèi)存中的低地址處,這種數(shù)據(jù)存儲(chǔ)方法叫做小法;將數(shù)據(jù)最高位存儲(chǔ)在內(nèi)存中的低地
    發(fā)表于 01-13 14:09 ?1次下載
    C語(yǔ)言 <b class='flag-5'>大端</b>小<b class='flag-5'>端</b>判斷代碼
    RM新时代网站-首页