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...