C語言RLE壓縮解壓演算法(西電C程式作業4)

2021-10-06 23:11:45 字數 2285 閱讀 7398

4、rle壓縮解壓演算法

涉及知識點:檔案讀寫、位操作、記憶體管理、結構體定義、rlw演算法、命令列引數

要求:編寫乙個程式,可以在命令列輸入引數,完成指定檔案的壓縮解壓

命令列引數如下

rle file1 –c(-d) file2

第乙個引數為可執行程式名稱,第二個引數為源檔名,第三個引數為壓縮或解壓縮選項,第四個引數為新檔名

主體思路如下:

為了實現rle演算法,我們可以使用 [個數][資料] 的最基本的方式執行,但是,當不重複的資料過多時,比如說abcdef,那麼檔案的長度在壓縮後就會增長一倍!所以,我們需要改變策略,同樣是使用

[個數][資料] 的方法,當重複資料個數大於3時,我們才選擇將其壓縮為[個數][重複資料]的方式,否則使用[個數] ([非重複資料]*個數)來記錄資料,這樣,至少可以保證非重複資料過多時,檔案壓縮後不會過大。

#include

#include

#include

#define max 65536000

//儲存檔案

//由於使用的是char來儲存資料,char的最大值也就只有255,

//其中char的首位我們需要用來記錄接下來的資料,所以能夠記錄的最大長度也就只有127

unsigned

char file1[max]

;unsigned

char file2[max]

;//判斷是否超過3位相同

intjudge

(unsigned

char

* src,

int left)

//不重複時的長度

intgetcnt

(unsigned

char

* src,

int left)

return cnt;}}

//編碼

intencode

(unsigned

char

* src,

int srcsize,

unsigned

char

* dst,

int dstsize)

else

break;}

}//首位置1

*dstbuf = cnt |

128;

dstbuf++

;*dstbuf =

*srcbuf;

dstbuf++

; dstleft -=2

;if(cnt !=

127|| flag ==1)

}else

srcbuf +

= num;

srcleft -

= num;

dstleft -

= num +1;

}}return dstsize - dstleft;

}//解碼

intdecode

(unsigned

char

* src,

int srcsize,

unsigned

char

* dst,

int dstsize)

//更新資料

srcbuf +=2

; srcleft -=2

; dstleft -

= len -

128;

}else

srcleft -=1

+ len;

dstleft -

= len;}}

return dstsize - dstleft;

}int

main

(int argc,

char

** ar**)

int t =0;

int a =0;

//讀取檔案

while

((a =

fgetc

(f1))!=

eof)

f2 =

fopen

(ar**[3]

,"wb");

int size = t;if(

strcmp

(ar**[2]

,"-d")==

0)else

fwrite

(file2, size,

sizeof

(unsigned

char

), f2)

;return0;

}

C語言程式設計之RLE壓縮解壓演算法

遊程編碼 run length encoding,rle 又稱行程長度編碼或者變動長度編碼法,在控制理論中對於二值影象而言是一種編碼方法,對連續的黑,白向畫素以不同的碼字進行編碼。遊程編碼是一種簡單的無失真壓縮方法,其特點是壓縮和解壓縮都非常快。該方法是用重複位元組和重複次數來簡單的描述重複的位元組...

RLE壓縮和解壓演算法以及鍊錶翻轉

include include struct rlenode 壓縮字串 struct rlenode encode char str if ptr i ptr i 1 ptr return head 解壓字串 char decode struct rlenode head else p p next...

c 解壓以及壓縮

解壓壓縮工具類 如下 示例 using system using system.io using system.diagnostics using microsoft.win32 using icsharpcode.sharpziplib.checksums using icsharpcode.sh...