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)制文件如下:
這里列出的是在 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è),或者無能為力誓竿。