寫在前面:本次實驗由老師寫好了lzw編碼的**,先理解了已有**之後,自己再寫解碼**時比較容易。下面給出完整的**以及實驗結果
bitio.h(全部由老師給出,自己寫了一些注釋)
/*
* declaration for bitwise io
* * vim: ts=4 sw=4 cindent
*/#ifndef __bitio__
#define __bitio__
#include
typedef
struct
bitfile;
bitfile *
openbitfileinput
(char
*filename)
;bitfile *
openbitfileoutput
(char
*filename)
;void
closebitfileinput
( bitfile *bf)
;void
closebitfileoutput
( bitfile *bf)
;int
bitinput
( bitfile *bf)
;unsigned
long
bitsinput
( bitfile *bf,
int count)
;void
bitoutput
( bitfile *bf,
int bit)
;void
bitsoutput
( bitfile *bf,
unsigned
long code,
int count)
;#endif
// __bitio__
bitio.cpp(全部由老師給出)
/*
* definitions for bitwise io
* * vim: ts=4 sw=4 cindent
*/#define _crt_secure_no_warnings
#include
#include
#include
"bitio.h"
bitfile *
openbitfileinput
(char
*filename)
bitfile *
openbitfileoutput
(char
*filename)
void
closebitfileinput
( bitfile *bf)
void
closebitfileoutput
( bitfile *bf)
intbitinput
( bitfile *bf)
} value = bf-
>mask & bf-
>rack;
bf->mask >>=1;
if(0==bf-
>mask) bf-
>mask =
0x80
;return((
0==value)?0
:1);
}unsigned
long
bitsinput
( bitfile *bf,
int count)
return value;
}void
bitoutput
( bitfile *bf,
int bit)
}void
bitsoutput
( bitfile *bf,
unsigned
long code,
int count)
}#if 0
intmain
(int argc,
char
**ar**)
}else}if
(2}else
}while(1
)return0;
}#endif
lzw_e.cpp(解碼部分由自己編寫,其他部分由老師給出,自己寫了一部分注釋)
/*
* definition for lzw coding
* * vim: ts=4 sw=4 cindent nowrap
*/#define _crt_secure_no_warnings
#include
#include
#include
"bitio.h"
#define max_code 65535
struct
dictionary[max_code+1]
;//陣列下標為編碼
int next_code;
int d_stack[max_code]
;// stack for decoding a phrase
#define input(f) ((int)bitsinput( f, 16))
#define output(f, x) bitsoutput( f, (unsigned long)(x), 16)
intdecodestring
(int start,
int code)
;void
initdictionary
(void);
void
printdictionary
(void)}
intdecodestring
(int start,
int code)
return count;
}void
initdictionary
(void
) dictionary[
255]
.nextsibling =-1
;//最後乙個根節點沒有下乙個兄弟
next_code =
256;}/*
* input: string represented by string_code in dictionary,
* output: the index of character+string in the dictionary
* index = -1 if not found
*/int
indictionary
(int character,
int string_code)
return-1
;}void
addtodictionary
(int character,
int string_code)
else
next_code ++;}
void
lzwencode
( file *fp, bitfile *bf)
else
string_code = character;
//將新字元做為字首}}
output
( bf, string_code)
;//輸入檔案掃瞄完成,將最後未輸出的字首輸出
}void
lzwdecode
( bitfile *bf, file *fp)
else
phrase_length =
decodestring(0
, new_code)
; character = d_stack[phrase_length -1]
;while
(phrase_length >0)
if(max_code > next_code)
addtodictionary
(character, last_code)
; last_code = new_code;
//新編碼變為舊編碼}}
intmain
(int argc,
char
**ar**)if(
'e'== ar**[1]
[0])
}elseif(
'd'== ar**[1]
[0])
}else
return0;
}
測試**:先寫乙個a.dat,將abbababac寫入其中。經過lzw編碼後生成b.dat,解碼後生成c.dat,可見編碼再解碼後的檔案與原檔案一致。
選擇10種不同格式的檔案進行lzw編碼並比較壓縮效率:
除了bdf(quartus ii原理**件)和vwf(quartus ii**波形檔案)之外,其他檔案在進行lzw編碼後大小反而增加了。
資料壓縮原理實驗4 實驗報告
一 實驗原理 1 編碼 利用信源相鄰符合之間的相關性 根據某一模型利用以往的樣本值對新樣本進行 然後將樣本的實際值與其 值相減得 到乙個誤差值,最後對這一誤差值進行編碼。如果模型足夠好,且樣本序列在時間上相關性 較強,則誤差訊號的幅度將遠遠小於原始訊號 從而得到較大的資料壓縮。2 dpcm編譯碼原理...
資料壓縮實驗一 yuv轉rgb格式實驗報告
一 實驗基本原理 yuv轉 rgb格式轉換公式 r y 1.4020 v 128 g y 0.3441 u 128 0.7141 v 128 b y 1.7720 u 128 分析 由rgb到 yuv格式的轉換公式 y 0.2990r 0.5870g 0.1140b r y 0.7010r 0.58...
資料壓縮實驗報告2 bmp轉yuv
1 bmp檔案格式 bmp bitmap 是windows作業系統中的標準影象檔案格式,可分為裝置相關位圖 ddb 和裝置無關位圖 dib 使用十分廣泛。它採用位對映存貯格式,除了影象深度可選外,絕大多數無壓縮,因此所佔空間很大。bmp檔案的影象深度可選1bit,4bit,8bit,16bit及24...