二進(jìn)制文件IO與大小端

1. 判斷本機(jī)的大小端

C語言簡(jiǎn)單判斷本地機(jī)器是大端還是小端原文鏈接

int isBigEndian()
{
    unsigned short test = 0x1234;//2 Bytes usigned integer for test Endian mode
    if(*((unsigned char*)&test)==0x12)
        return 1;
    else
        return 0;
}

指針的威力可見一斑!

取test地址琢歇,并強(qiáng)制轉(zhuǎn)化為unsigned char指針。

(unsigned char*)&test

以u(píng)nsigned char 規(guī)則來訪問test首地址的一個(gè)字節(jié)

*((unsigned char*)&test)

判斷該字節(jié)的值與0x12還是0x34相等,若與0x12相等绽慈,則本地低地址存高字節(jié),是大端辈毯;若與0x34相等坝疼,則本機(jī)低地址存低字節(jié),是小端谆沃。

2. 二進(jìn)制文件IO

2.1 文件格式

所有文件钝凶,籠統(tǒng)意義上將可以區(qū)分為兩類,一類是文本文件唁影,一類是二進(jìn)制文件耕陷。

(1) 文本文件

文本文件用記事本等文本編輯器打開,我們可以看懂上面的信息据沈。所以使用比較廣泛哟沫。通常一個(gè)文本文件分為很多很多行,作為數(shù)據(jù)儲(chǔ)存時(shí)锌介,還有列的概念嗜诀。實(shí)際上猾警,儲(chǔ)存在硬盤或其他介質(zhì)上,文件內(nèi)容是線一樣儲(chǔ)存的隆敢,列是用空格或 Tab 間隔发皿,行是用回車和換行符間隔。
文本文件的編碼方式舉例:

'Big5'
'ISO-8859-1'
'GB2312'
'GBK'
'US-ASCII'
'UTF-8'
(2) 二進(jìn)制文件

二進(jìn)制文件拂蝎,是無格式有數(shù)據(jù)類型的穴墅。比如上面的 10 11 12 三個(gè)數(shù)。但二進(jìn)制文件沒有行的概念温自。我們要緊湊地儲(chǔ)存他們玄货。(當(dāng)然也可以中間加入一些空白的字節(jié))
  從數(shù)據(jù)類型上來說,我們首先考慮整型捣作。如果把 10 11 12 當(dāng)作 2 字長的整型誉结。則 10 表示為:0Ah 00h。因?yàn)?0Ah 對(duì)應(yīng)十進(jìn)制 10券躁。而后面的 00h 是空白位惩坑。2 字長的整型如果不足 FFh,也就是不足 255也拜,則需要一個(gè)空白位以舒。類似的:11 表示為 0Bh 00h,12 表示為 0Ch 00h慢哈。
  當(dāng)整型數(shù)據(jù)超過 255 時(shí)蔓钟,我們需要 2 個(gè)字節(jié)來儲(chǔ)存。比如 2748(ABCh)卵贱,則表示為:BCh 0Ah滥沫。要把低位寫在前面(BCh),高位寫在后面(0Ah)键俱。
  當(dāng)整型數(shù)據(jù)超過 65535 時(shí)兰绣,我們就需要 4 個(gè)字節(jié)來儲(chǔ)存。比如 439041101(1A2B3C4Dh)编振,則表示成:4Dh 3Ch 2Bh 1Ah缀辩。當(dāng)數(shù)據(jù)再大時(shí),我們就需要 8 字節(jié)儲(chǔ)存了踪央。
  二進(jìn)制文件的實(shí)型數(shù)據(jù)也有字節(jié)長度的區(qū)分臀玄,比如 4 字長,8 字長畅蹂。但實(shí)型數(shù)據(jù)的長度并不僅僅代表它的表達(dá)的范圍健无,更多的代表精度。所以液斜,8 字長的我們又稱為雙精度累贤。關(guān)于實(shí)型數(shù)據(jù)如何儲(chǔ)存為 2 進(jìn)制募胃。則有很多套規(guī)則。現(xiàn)在都廣泛使用的是 IEEE 標(biāo)準(zhǔn)浮點(diǎn)格式畦浓。關(guān)于這樣的規(guī)則,我還正在了解检疫,比較麻煩讶请。就不多說了。在這里也沒有必要了解屎媳。
  二進(jìn)制文件也可以儲(chǔ)存字符型數(shù)據(jù)夺溢,儲(chǔ)存方法和文本文件一樣。都是使用 ASCII 編碼儲(chǔ)存的烛谊。所以我們用記事本打開某些二進(jìn)制文件時(shí)风响,也能看到一些有意義的字符串。(無意義的亂碼我們可以認(rèn)為是整型或?qū)嵭偷べ鳎贿^記事本程序當(dāng)作字符來解釋状勤,因此造成了亂碼)

(3)為什么要使用二進(jìn)制文件?
  • 第一是二進(jìn)制文件比較節(jié)約空間双泪,這兩者儲(chǔ)存字符型數(shù)據(jù)時(shí)并沒有差別持搜。但是在儲(chǔ)存數(shù)字,特別是實(shí)型數(shù)字時(shí)焙矛,二進(jìn)制更節(jié)省空間葫盼,比如儲(chǔ)存 Real*4 的數(shù)據(jù):3.1415927,文本文件需要 9 個(gè)字節(jié)村斟,分別儲(chǔ)存:3 . 1 4 1 5 9 2 7 這 9 個(gè) ASCII 值贫导,而二進(jìn)制文件只需要 4 個(gè)字節(jié)(DB 0F 49 40)
  • 第二個(gè)原因是,內(nèi)存中參加計(jì)算的數(shù)據(jù)都是用二進(jìn)制無格式儲(chǔ)存起來的蟆盹,因此孩灯,使用二進(jìn)制儲(chǔ)存到文件就更快捷。如果儲(chǔ)存為文本文件日缨,則需要一個(gè)轉(zhuǎn)換的過程钱反。在數(shù)據(jù)量很大的時(shí)候,兩者就會(huì)有明顯的速度差別了匣距。
  • 第三面哥,就是一些比較精確的數(shù)據(jù),使用二進(jìn)制儲(chǔ)存不會(huì)造成有效位的丟失毅待。
(4)如何解釋二進(jìn)制存儲(chǔ)文件的內(nèi)容 尚卫?

列舉一個(gè)二進(jìn)制文件如下:

二進(jìn)制存儲(chǔ).png

這里列出的是在 UltraEdit(UE) 里看到的東西。其實(shí)只有紅色部分是文件內(nèi)容尸红。前面的是 UE 加入的行號(hào)吱涉。后面的是 UE 嘗試解釋為字符型的參考刹泄。

這個(gè)文件一共有 32 字節(jié)長。顯示為兩列怎爵,每列 16 個(gè)字節(jié)特石。實(shí)際上,這僅僅是 UE 的顯示而已鳖链。真實(shí)的文件并不分行姆蘸。僅僅知道這個(gè)文件的內(nèi)容,如果我們沒有任何說明的話芙委,是不能看出任何有用信息的逞敷。

下面我規(guī)定一下說明:我們認(rèn)為,前 4 個(gè)字節(jié)是一個(gè) 4 字節(jié)的整型數(shù)據(jù)(0F 01 00 00 十六進(jìn)制:10Fh 十進(jìn)制:271)灌侣。這 4 個(gè)字節(jié)之后的 4 個(gè)字節(jié)是另一個(gè) 4 字節(jié)的整型數(shù)據(jù)(0F 03 00 00 十六進(jìn)制:30Fh 十進(jìn)制:783)推捐。其后的 4 個(gè)字節(jié)(12 53 21 45 )表示一個(gè) 4 字節(jié)的實(shí)型數(shù)據(jù):2.5811919E+3。再其后的 4 個(gè)字節(jié)(58 62 35 34)表示另一個(gè) 4 字節(jié)的實(shí)行數(shù)據(jù):1.6892716E-7侧啼。而只后的 16 個(gè)字節(jié)(41 42 43 44 45 46 47 48 49 47 4B 4C 4D 4E 4F 50)我們認(rèn)為是 16 個(gè)字節(jié)的字符串(ABCDEFGHIGKLMNOP)

實(shí)際上牛柒,二進(jìn)制文件只是儲(chǔ)存數(shù)據(jù),并不寫明數(shù)據(jù)類型痊乾,比如上面的第 9 字節(jié)到第 16 字節(jié)(12 53 21 45 58 62 35 34)焰络,我們剛才認(rèn)為是 2 個(gè) 4 字節(jié)的實(shí)型,其實(shí)也可以認(rèn)為是 8 個(gè)字節(jié)的字符型( S!EXb54)符喝。而后面的 16 個(gè)字節(jié)的字符串(ABCDEFGHIGKLMNOP)闪彼,我們也可以認(rèn)為是 2 個(gè) 8 字節(jié)的整型,或者 4 個(gè) 4 字節(jié)的整型协饲,甚至 2 個(gè) 8 字節(jié)的實(shí)型畏腕,4 個(gè) 4 字節(jié)的實(shí)型,等等等等茉稠。

因此描馅,面對(duì)一個(gè)二進(jìn)制文件,我們不能準(zhǔn)確地知道它的含義而线,我們需要他的數(shù)據(jù)儲(chǔ)存方式的說明铭污。這個(gè)說明告訴我們第幾個(gè)字節(jié)到第幾個(gè)字節(jié)是什么類型的數(shù)據(jù),儲(chǔ)存的數(shù)據(jù)是什么含義膀篮。否則的話嘹狞,我們只能猜測(cè),或者無能為力誓竿。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末磅网,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子筷屡,更是在濱河造成了極大的恐慌涧偷,老刑警劉巖簸喂,帶你破解...
    沈念sama閱讀 211,743評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異燎潮,居然都是意外死亡喻鳄,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門确封,熙熙樓的掌柜王于貴愁眉苦臉地迎上來诽表,“玉大人,你說我怎么就攤上這事隅肥。” “怎么了袄简?”我有些...
    開封第一講書人閱讀 157,285評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵腥放,是天一觀的道長。 經(jīng)常有香客問我绿语,道長秃症,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,485評(píng)論 1 283
  • 正文 為了忘掉前任吕粹,我火速辦了婚禮种柑,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘匹耕。我一直安慰自己聚请,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評(píng)論 6 386
  • 文/花漫 我一把揭開白布稳其。 她就那樣靜靜地躺著驶赏,像睡著了一般。 火紅的嫁衣襯著肌膚如雪既鞠。 梳的紋絲不亂的頭發(fā)上煤傍,一...
    開封第一講書人閱讀 49,821評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音嘱蛋,去河邊找鬼蚯姆。 笑死,一個(gè)胖子當(dāng)著我的面吹牛洒敏,可吹牛的內(nèi)容都是我干的龄恋。 我是一名探鬼主播,決...
    沈念sama閱讀 38,960評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼凶伙,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼篙挽!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起镊靴,我...
    開封第一講書人閱讀 37,719評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤铣卡,失蹤者是張志新(化名)和其女友劉穎链韭,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體煮落,經(jīng)...
    沈念sama閱讀 44,186評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡敞峭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蝉仇。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片旋讹。...
    茶點(diǎn)故事閱讀 38,650評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖轿衔,靈堂內(nèi)的尸體忽然破棺而出沉迹,到底是詐尸還是另有隱情,我是刑警寧澤害驹,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布鞭呕,位于F島的核電站,受9級(jí)特大地震影響宛官,放射性物質(zhì)發(fā)生泄漏葫松。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評(píng)論 3 313
  • 文/蒙蒙 一底洗、第九天 我趴在偏房一處隱蔽的房頂上張望腋么。 院中可真熱鬧撼短,春花似錦疯趟、人聲如沸闪金。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽此洲。三九已至辉浦,卻和暖如春饭寺,著一層夾襖步出監(jiān)牢的瞬間胡控,已是汗流浹背扳剿。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評(píng)論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留昼激,地道東北人庇绽。 一個(gè)月前我還...
    沈念sama閱讀 46,370評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像橙困,于是被迫代替她去往敵國和親瞧掺。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容