• 大小: 1.01MB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2023-11-08
  • 语言: C/C++
  • 标签: LZW  无损压缩  

资源简介

本程序实现了LZW的无损文本压缩,使用C语言实现,整个文件为VC的工程。

资源截图

代码片段和文件信息

#pragma warning(disable:4786)
//...
#include  
#include  
//...
#include 
#include “BitToByte.h“

using namespace std;
using namespace BitToByte;

void init_table();
void decode();
void init_decode_dictionary();


map dictionary;
map decode_dictionary; 
//int Buff[4000];

int num = 0;

int main()
{
init_table();

char ch;

FILE *fp;

int* bits = new int;

if((fp=fopen(“I have a dream.txt““r“))==NULL) 
{
printf(“not open“);
return 1;
}

int code = 0;

// map m;
// m.insert(pair(1“st“));
// dictionary.insert(pair(“student_three“ code));

unsigned char * r = new unsigned char[4];

string str;
string c;

ch = fgetc(fp);
str = ch;

unsigned char * cr = new unsigned char[4]; 

while (true) 
{
ch=fgetc(fp);

c = ch;
if (dictionary.find(str + c) != dictionary.end())
{
str += c;
}
else
{
// cout << (dictionary.find(str))->second << “ “;

int res = (dictionary.find(str))->second;
// cout << res << “ “;
intToCharPoint(res 12 cr);
addToBuff(cr 12);

// printBuff();
// cout << (int)Buff[i] << endl;
num++;

dictionary.insert(map::value_type(str + c dictionary.size()));
str = c;

if (ch == EOF)
break;
}

// putchar(ch);
}
// printBuff();


// cout << num;
saveAsFile(“LZW.txt“);

cout << endl;

decode();


/*
FILE *fp2;

if((fp2=fopen(“LZW.txt““r“))==NULL) 
printf(“not open“);



int k = 0;
while (k < 4884) 
{
k++;

ch=fgetc(fp2);
cout << ch << “ “;
}*/


return 0;
}

void decode()
{
FILE *fp;

if((fp=fopen(“LZW.txt““r“))==NULL) 
printf(“not open“);

init_decode_dictionary();

string str = ““;

string entry;


unsigned char* cp = new unsigned char[3];
int sizeOfByte = 0;
int res = 0;

int num = 0;

bool odd = true;
while (num <= BitToByte::size_of_file) /* 从文件读一字符,显示到屏幕*/
{

if (odd)
{
odd = false;
// sizeOfByte = fread(cp 1 3 fp);
*cp=buff[num];
num++;
*(cp+1)=buff[num];
num++;
*(cp+2)=buff[num];
num++;
// if ((*cp == EOF)||(*(cp+1) == EOF)||(*(cp+2) == EOF))
// break;
// if (sizeOfByte != 3 )
// break;

res = (*cp) * 16 + ((*(cp+1)) >> 4);
}
else
{
res = ((*(cp + 1)) & 0x0f) * 256 + *(cp+2);
odd = true;
}
// ch = Buff[i];
if (decode_dictionary.find(res) != decode_dictionary.end())
entry  = (decode_dictionary.find(res))->second;
else
entry = str + str[0];
cout << entry;

// cout << res << “ “;

if (str != ““)
{
decode_dictionary.insert(map::value_type(decode_dictionary.size() str + entry[0]));
}
str= entry;
i++;
// entry = dictionary
}

// cout << sizeOfByte << endl;

// cout << num << endl;

cout << endl;
}


void init_table()
{

char c

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       4501  2011-10-25 10:53  LZW\BitToByte.h

     文件     589861  2011-10-25 10:53  LZW\Debug\LZW.exe

     文件     865968  2011-10-25 10:53  LZW\Debug\LZW.ilk

     文件    2575200  2011-10-24 16:58  LZW\Debug\LZW.pch

     文件    1238016  2011-10-25 10:53  LZW\Debug\LZW.pdb

     文件     377096  2011-10-25 10:53  LZW\Debug\main.obj

     文件      99328  2011-10-25 10:53  LZW\Debug\vc60.idb

     文件     159744  2011-10-25 10:53  LZW\Debug\vc60.pdb

     文件       9134  2011-10-23 11:38  LZW\I have a dream.txt

     文件       4313  2011-10-24 17:47  LZW\LZW.dsp

     文件        529  2011-10-24 16:30  LZW\LZW.dsw

     文件      50176  2011-10-25 10:53  LZW\LZW.ncb

     文件      50688  2011-10-25 10:53  LZW\LZW.opt

     文件       1242  2011-10-25 10:53  LZW\LZW.plg

     文件       4885  2011-10-25 10:53  LZW\LZW.txt

     文件       5370  2011-10-25 10:52  LZW\main.cpp

     文件          9  2011-10-24 17:43  LZW\res

     文件       3256  2011-10-24 21:50  LZW\res.txt

     文件         14  2011-10-24 17:20  LZW\test - 副本.txt

     文件         15  2011-10-24 21:08  LZW\test.txt

     目录          0  2011-10-25 10:53  LZW\Debug

     目录          0  2011-10-25 10:53  LZW

----------- ---------  ---------- -----  ----

              6039345                    22


评论

共有 条评论