格式
ASCII
MIME
.txt
Windows的.txt文件
數據存儲
與二進制文件比較
定義
存取
優缺點
定義
使用二進制文件的好處
第一是二進制文件比較節約空間,這兩者儲存字符型數據時並沒有差別。但是在儲存數字,特別是實型數字時,二進制更節省空間,比如儲存 Real*4 的數據:3.1415927,文本文件需要 9 個字節,分別儲存:3 . 1 4 1 5 9 2 7 這 9 個 ASCII 值,而二進制文件只需要 4 個字節(DB 0F 49 40)
第二個原因是,內存中參加計算的數據都是用二進制無格式儲存起來的,因此,使用二進制儲存到文件就更快捷。如果儲存為文本文件,則需要一個轉換的過程。在數據量很大的時候,兩者就會有明顯的速度差別了。
第三,就是一些比較精確的數據,使用二進制儲存不會造成有效位的丟失。[1]
二進制文件的儲存方式
這個文件一共有 32 字節長。顯示為兩列,每列 16 個字節。實際上,這僅僅是 UE 的顯示而已。真實的文件並不分行。僅僅知道這個文件的內容,如果我們沒有任何說明的話,是不能看出任何有用信息的。
下面我規定一下說明:我們認為,前 4 個字節是一個 4 字節的整型數據(0F 01 00 00 十六進制:10Fh 十進制:271)。這 4 個字節之后的 4 個字節是另一個 4 字節的整型數據(0F 03 00 00 十六進制:30Fh 十進制:783)。其后的 4 個字節(12 53 21 45 )表示一個 4 字節的實型數據:2.5811919E+3。再其后的 4 個字節(58 62 35 34)表示另一個 4 字節的實行數據:1.6892716E-7。而只后的 16 個字節(41 42 43 44 45 46 47 48 49 47 4B 4C 4D 4E 4F 50)我們認為是 16 個字節的字符串(ABCDEFGHIGKLMNOP)
實際上,二進制文件只是儲存數據,並不寫明數據類型,比如上面的第 9 字節到第 16 字節(12 53 21 45 58 62 35 34),我們剛才認為是 2 個 4 字節的實型,其實也可以認為是 8 個字節的字符型( S!EXb54)。而后面的 16 個字節的字符串(ABCDEFGHIGKLMNOP),我們也可以認為是 2 個 8 字節的整型,或者 4 個 4 字節的整型,甚至 2 個 8 字節的實型,4 個 4 字節的實型,等等等等。
因此,面對一個二進制文件,我們不能准確地知道它的含義,我們需要他的數據儲存方式的說明。這個說明告訴我們第幾個字節到第幾個字節是什么類型的數據,儲存的數據是什么含義。否則的話,我們只能猜測,或者無能為力。[1]
如何使用語句操作二進制文件
讀取和寫入二進制其實是兩個很類似的操作,了解了其中之一,另一個也就不難了。
記錄長度在某些編譯器下表示讀取的 4 字節長度的倍數,規定為 4 表示記錄長度為 16 字節。有些編譯器下就直接表示記錄的字節數,規定為 4 則表示記錄長度為 4 字節。這個問題需要參考編譯器手冊。在 VF 系列里,這個值是前面一個含義。可以通過設置工程屬性的 Fortran,Data,Use Bytes as RECL= Unit for Unformatted Files 來改變,使之成為后一個含義。在命令行模式下,則使用 /assume:byterecl 這個編譯選項。
確定 RecL 大小是我們需要做的事情,一般來說,不適合太大,也不適合太小。還需要結合數據儲存方式來考慮。太小的話,我們需要執行讀寫的次數就多,太大的話,我們就不方便操作小范圍的數據。
有時候我們甚至會分多次來讀取數據,每一次的 RecL 都不同。對於上面的 TestBin.Bin 文件來說,它比較簡單,我以 16 字節長度和 8 字節長度兩種讀取方式來演示,你甚至可以一次 32 個字節長度全部讀完。[1]
用例
|
fread
|
fwrite
|
ifstream.read()
|
ofstream.write()
|
|
文件讀
|
文件寫
|
||
|
FileInputStream()
|
FileOutputStream()
|
|
文件輸入流()
|
文件輸出流()
|
漢字怎樣轉化為二進制代碼?
各數制之間的轉換
我們用R表示任何數制的基數,討論各數制之間的轉換。
1.R進制數轉換為十進制數
二進制、八進制和十六進制數轉換為等值的十進制數,只要把它們用多項式表示並在十進制下進行計算,所得的結果就是十進制數。
2.十進制數轉換為R進制數
十進制數轉換為等值的二進制、八進制和十六進制數,需要對整數部分和小數部分分別進行轉換。其整數部分用連續除以基數R取余數的方法來完成,小數部分用連續乘以基數R取整數的方法來實現。
基數 基數 基數 基數 基數
十進制 10000 1000 100 10 1
二進制 16 8 4 2 1
八進制 4096 512 64 8 1
十六進制 65536 4096 256 16 1
3.二進制數與八進制數、十六進制數的轉換
二進制數與八進制數的轉換應以"3位二進制數對應1位八進制數"%的原則進行。同理,因為24=16,則二進制數與十六進制數的轉換應以"4位二進制數對應1位十六進制數"的原則進行。
四、二進制數的運算
在計算機中,二進制數的運算包括算術運算和邏輯運算。
1.二進制數的算術運算
(1)二進制數加法
加法原則:逢二進一
(2)二進制數減法
減法原則:借一當二
(3)二進制數乘法
乘法原則:與算術乘法形式相同
(4)二進制數除法
除法原則:與算術除法形式相同
2.二進制數的邏輯運算
邏輯運算是以二進制數為基礎的,邏輯變量只有兩個,用來表示邏輯"真"和"假"。
(1)邏輯加法("或"運算)
運算符號:"+"或"∨"
運算規則:0+0=0;0+1=1;1+0=1;1+1=1;
(2)邏輯乘法("與"運算)
運算符號:"×"或"∧"
運算規則:0×0=0;0×1=0;1×0=0;1×1=1;
(3)邏輯"非"運算
運算符號:"-"%運算規則:A&-*=0時,A=1
五、數據類型及數據單位
1.數據的兩種類型
計算機中的數據可概括分為兩大類:數值型數據和字符型數據。所有的非數值型數據都要經過數字化后才能在計算機中存儲和處理。
2.數據單位
在計算機中通常使用三個數據單位:位、字節和字。位的概念是:最小的存儲單位,英文名稱是bit,常用小寫b或bit表示。用8位二進制數作為表示字符和數字的基本單元,
英文名稱是byte,稱為一字節。通常用大"B"表示。
1B(字節)=8b(位)
1KB(千字節)=1024B(字節)
1MB(兆字節)=1024KB(千字節)
字長:字長也稱為字或計算機字,它是計算機能並行處理的二進制數的位數。
六、字符編碼與漢字編碼
1.字符編碼
目前微型機中普遍采用的字符編碼是ASCII碼。它是用七位二進制數對127個字符進行編碼,其中前32個是一些不可打印的控制符號。
2.漢字編碼及字模信息
漢字有兩種編碼:國標碼與機內碼。
國標碼是"中華人民共和國國家標准信息交換漢字編碼",代號為"GB2312-80"。在國標碼的字符集中,收集了一級漢字3755個,二級漢字3008個,圖形符號682個,共7445個。一個漢字對應一個區位碼,由四位數字組成,前兩位數字為區碼(0~94),后兩位數字為位碼(0~94)。機內碼是指漢字在計算機中的編碼
漢字的機內碼占兩個字節,分別稱為機內碼的高位與低位。它們與區位碼的關系如下:
機內碼高位=區碼+A0H
機內碼低位=位碼+A0H
漢字字庫是由所有漢字的字模信息構成的。一個漢字字模信息占若干字節,究竟占多少個字節由漢字的字形決定。
例如,如果用16×16點陣表示一個漢字,則一個漢字占16行,每行有16個點,在存儲時用兩個字節存放一行上16個點的信息,對應位為"0"表示該點為"白","1"表示該點為"黑"。因此,一個16×16點陣的漢字占32個字節。
---------------------------------------------------------------
描述2進制的數據結構,用字符串直觀,但是效率低,用數組效率高,但是不直觀。
但是道理相同。
性字轉換后的結果:
010000010000 010010010000 010010010100 111011111110 110010010000 010100010000 010011111110 010000010000 010000010000 010000010000 010111111110 000000000000
144位編碼,這也不可能的,
性字編碼alert asc("性")得到-12076,轉化為2進制為-10111100101100 不算正負有14位就夠了。
如果非要補到144位也因該是高位補0。
function c10to2(x)
'10進制到2進制的轉換
dim sign, result
result = ""
'符號
sign = sgn(x)
x = abs(x)
if x = 0 then
c10to2 = 0
exit function
end if
do until x = "0"
result = result & (x mod 2)
x = x \ 2
loop
result = strReverse(result)
if sign = -1 then
c10to2 = "-" & result
else
c10to2 = result
end if
end function
---------------------------------------------------------------
另外一個人的寫法:
function c10to2(x)
mysign=sgn(x)
x=abs(x)
DigS=1
do
if x<2^DigS
二進制編碼轉漢字:
1. 漢字信息交換碼(國標碼)
《信息交換用漢字 編碼字符集·基本集》是我國於1980年制定的國家標准 GB2312-80,代號為國標碼,是國家規定的用於漢字信息處理使用的代碼依據。
GB2312-80中規定了信息交換用的6763個漢字和682個非漢字圖形符號(包括幾種外文字母、數字和符號)的代碼。
6763個漢字又按其 使用頻度、組詞能力以及用途大小分成一級常用漢字3755個和二級常用漢字3008個。
一級漢字按拼音字母順序排列;若遇同音字,則 按起筆的筆形順序排列;若起筆相同,則按第二筆的筆形順序排列,依次類推。所謂筆形順序,就是橫、豎、撇、點和折的順序。二級漢字按 部首順序排列。
在此標准中,每個漢字(圖形符號)采用雙字節表示。每個字節只用低7位,最高位恆為1。由於低7位中有34種狀態是用 於控制字符,因此,只有94(128-34=94)種狀態可用於漢字編碼。這樣,雙字節的低7位只能表示94×94=8836種狀態。
編碼范圍
十進制數碼
基本 ASCII 碼
00000000~01111111
0~127
控制字符
00000000~00100000、01111111
0~32、127
可用漢字段
00100001~01111110
33~126 (1~94)
擴充 ASCII 碼
10000000~11111111
128~255
控制字符
10000000~10100000、11111111
128~160、255
GB2312-80
10100001~11111110
161~254 (1~94)
此標准的漢字編碼表有94行、94列,其行號稱為區號,列號稱為位號。雙字節中,用 高字節表示區號,低字節表示位號。非漢字圖形符號置於第1~11區,一級漢字3755個且於第16~55區,二級漢字3008個置於第56~87區。
每個圖形字符的漢字交換碼,均用兩個字節的低7位二進制碼表示。漢字國標碼通常用十六進制數表示。
例如:“中”字的區號為 54,位號為48,計算它的二進制數和十六進制數國標碼。
解:先將區、位號分別加上 32 :
54+32=86
48+32=80
分別轉換為二進制數:
(86)10=01010110
(80)10=0 1010000
得到二進制數國標碼為:
01010110 01010000。
最后通過 8 4 2 1 ── 二進制取位法轉換成十六 進制漢字國標碼為:5650。
又如“國”字的區號為25,位號為90,用以上相同的方法得到它的國標碼為:
二進制:00111001 01111010
十六進制:397A
----------------------------------------------------------------
基於以上原則,則
11000100,11100011,10111010,11000011
>(1100 0100 1110 0011)2,(1011 1010 1100 0011)2
>(C4E3)16,(BAC3)16
>查表可知:C4E3>>‘你’,BAC3>>‘好’



