【問題E18】:文字檔案壓縮與解壓 縮 [回前頁]
說明:
1.檔案中的每一個字母均為7位元的ASCII,亦即各個位元組的第一個位元均為0,例如A的各個位元為0100 0001
2.壓縮的方式如下:檔案中的每行每一欄位往後取2至3個字元,和在同行此一欄位前的字串比對。(1)若此3字元和欄位n(0 £ n < 64)起的3字元相同,則將此3個字元壓縮編碼為8個位元的壓縮碼,最高、次高位元均為1,其餘6個低位元設定為n。(2)若僅有2字元相同,同樣的將此2字元壓縮編碼為8個位元。壓縮碼的次高位元為0,其餘和(1)的安排相同。(3)如果比對失敗,則以原字元輸出。我們用下面的兩行的英文檔案為例說明之:
HK activist dies in
isles protest: A Hong Kong activist drowned in a
rolling East China Sea on Thursday.
為了解釋的方便,我們將每一字元加上16進位的欄位腳標如下
第一行:H00K0102a03c04t05i06v07i08s09t0A0Bd0Ci0De0Es0F10i11n1213i14s15l16e17s1819p1Ar1Bo1Ct1De1Es1F
t20:
2122A2324H25o26n27g2829K2Ao2Bn2Cg2D2Ea2Fc
30t31i32v33i34s35t3637d38r39o3Aw3Bn3Ce3Dd3E3Fi40n4142a43
第二行:r00o01l02l03i04n05g0607E08a09s0At0B0CC0Dh0Ei0Fn10a1112S13e14a1516o17n1819T2Ah2Bu2Cr2Ds2Ed2Fa30y31.32
比對成功的欄位及其壓縮碼如下表,其餘欄位以原字元輸出。
行數 |
欄位 |
比對字串 |
對應欄位 |
比對成功的2-3字元壓縮成8位元 |
|||||||
|
|
|
|
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
1 |
13 |
i |
10 |
1 |
0 |
0 |
1 |
0 |
0 |
0 |
0 |
1 |
17 |
es |
0E |
1 |
1 |
0 |
0 |
1 |
1 |
1 |
0 |
1 |
1E |
es |
0E |
1 |
0 |
0 |
0 |
1 |
1 |
1 |
0 |
1 |
2B |
ong |
26 |
1 |
1 |
1 |
0 |
0 |
1 |
1 |
0 |
1 |
2E |
ac |
02 |
1 |
1 |
0 |
0 |
0 |
0 |
1 |
0 |
1 |
31 |
tiv |
05 |
1 |
1 |
0 |
0 |
0 |
1 |
0 |
1 |
1 |
34 |
ist |
08 |
1 |
1 |
0 |
0 |
1 |
0 |
0 |
0 |
1 |
37 |
d |
0B |
1 |
0 |
0 |
0 |
1 |
0 |
1 |
1 |
1 |
39 |
ro |
1B |
1 |
0 |
0 |
1 |
1 |
0 |
1 |
1 |
1 |
3F |
in |
10 |
1 |
1 |
0 |
1 |
0 |
0 |
0 |
0 |
1 |
42 |
a |
02 |
1 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
2 |
0F |
in |
04 |
1 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
2 |
15 |
a |
11 |
1 |
0 |
0 |
1 |
0 |
0 |
0 |
1 |
基於以上的做法,製作一壓縮與解壓程式。對壓縮程式而言,輸入為待壓縮的ASCII文字檔,輸出為為壓縮後(文字)檔案。對解壓縮程式,則剛好相反。