【問題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: 21
22A2324H25o26n27g2829K2Ao2Bn2Cg2D2Ea2Fc 30t31i32v33i34s35t3637d38r39o3Aw3Bn3Ce3Dd3E3Fi40n4142
a43

第二行: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文字檔,輸出為為壓縮後(文字)檔案。對解壓縮程式,則剛好相反。