当前位置:首页 > 用C++实现数据无损压缩、解压(使用LZW算法) - 图文
for(i = 0; i < 256; i ++) {
StrTable[i].string = (char *)realloc(StrTable[i].string, 1); StrTable[i].string[0] = i; StrTable[i].len = 1; }
StrTable[256].string = NULL; StrTable[256].len = 0; StrTable[257].string = NULL; StrTable[257].len = 0; ItemPt = 257; Bits = 9; }
void LZWCoder::CopyStr(TStr *d, TStr s) {
unsigned int i;
d->string = (char *)realloc(d->string, s.len); for(i = 0; i < s.len; i ++)
d->string[i] = s.string[i]; d->len = s.len; }
void LZWCoder::StrJoinChar(TStr *s, char c) {
s->string = (char *)realloc(s->string, s->len + 1); s->string[s->len ++] = c; }
unsigned int LZWCoder::InStrTable(TStr s) {
unsigned int i,j; bool b;
for(i = 0; i <= ItemPt; i ++) {
if(StrTable[i].len == s.len)
{
b = true;
for(j = 0; j < s.len; j ++)
if(StrTable[i].string[j] != s.string[j]) {
b = false; break; } if(b) return i; } }
return 65535; }
void LZWCoder::AddTableEntry(TStr s) {
CopyStr(&StrTable[++ItemPt], s); }
void LZWCoder::WriteCode(char *dest, unsigned int b) {
unsigned char i;
for(i = 0; i < Bits; i++) {
Bit[BitPt ++] = (b & (1 << (Bits - i - 1))) != 0; if(BitPt == 8) {
BitPt = 0;
dest[BytePt ++] = (Bit[0] << 7) + (Bit[1] << 6) + (Bit[2] << 5) + (Bit[3] << 4) + (Bit[4] << 3) + (Bit[5] << 2) + (Bit[6] << 1) + Bit[7];
} } }
unsigned int LZWCoder::GetNextCode(char *src) {
unsigned char i; unsigned int c = 0;
for(i = 0; i < Bits; i ++) {
c = (c << 1) + ((src[BytePt] & (1 << (8 - (BitPt ++) - 1))) != 0); if(BitPt == 8) {
BitPt = 0; BytePt ++; } }
return c; }
void LZWCoder::StrFromCode(TStr *s, unsigned int c) {
CopyStr(s, StrTable[c]); }
void LZWCoder::WriteString(char *dest, TStr s) {
unsigned int i;
for(i = 0; i < s.len; i++)
dest[OutBytes ++] = s.string[i]; }
unsigned int LZWCoder::Encode(char *src, unsigned int len, char *dest) {
TStr Omega, t; char k;
unsigned int i; unsigned int p; BytePt = 0; BitPt = 0; InitStrTable(); WriteCode(dest, 256); Omega.string = NULL; Omega.len = 0; t.string = NULL; t.len = 0;
for(i = 0; i < len; i ++) {
k = src[i];
CopyStr(&t, Omega); StrJoinChar(&t, k);
if(InStrTable(t) != 65535) CopyStr(&Omega, t); else {
WriteCode(dest, InStrTable(Omega)); AddTableEntry(t); switch(ItemPt) {
case 512: Bits = 10; break; case 1024: Bits = 11; break; case 2048: Bits = 12; break;
case 4096: WriteCode(dest, 256); InitStrTable(); }
Omega.string = (char *)realloc(Omega.string, 1); Omega.string[0] = k; Omega.len = 1; } }
WriteCode(dest, InStrTable(Omega)); WriteCode(dest, 257); Bits = 7;
共分享92篇相关文档