📄 file.cpp
字号:
//srcfile.read((char*)&newdcCode->diffValue,sizeof(short));
// srcfile.read((char*)&length,sizeof(unsigned short));
// srcfile.read((char*)&dbyte,sizeof(unsigned));
fread(&newdcCode->diffValue,sizeof(short),1,srcfile);
fread(&length,sizeof(unsigned short),1,srcfile);
fread(&dbyte,sizeof(unsigned),1,srcfile);
newdcCode->code=new char[length+1];
if(newdcCode->code==NULL){
cout<<"空间不足"<<endl;
exit(1);
}
for(int i=length-1;i>=0;i--){
if((dbyte>>i)&1){
newdcCode->code[length-i-1]='1';
}
else {newdcCode->code[length-i-1]='0';}
}
newdcCode->code[length]='\0';
newdcCode->count=0;
newdcCode->next=NULL;
pdcCode->next=newdcCode; //新节点加入链表末尾
pdcCode=newdcCode; //工作指针移位至链尾
}
/*-----------------------------------建立AC码表---------------------------------------*/
dbyte=0;
length=0;
//srcfile.read((char*)&acCodeListlength,sizeof(cltype));
fread(&acCodeListlength,sizeof(cltype),1,srcfile);
decodeListStruct* acCodeHead=new decodeListStruct;
if(acCodeHead==NULL){
cout<<"空间不足"<<endl;
exit(1);
}
//srcfile.read((char*)&acCodeHead->ep.run,sizeof(unsigned short));
//srcfile.read((char*)&acCodeHead->ep.level,sizeof(btype));
//srcfile.read((char*)&length,sizeof(unsigned short));
//srcfile.read((char*)&dbyte,sizeof(unsigned));
fread(&acCodeHead->ep.run,sizeof(unsigned short),1,srcfile);
fread(&acCodeHead->ep.level,sizeof(btype),1,srcfile);
fread(&length,sizeof(unsigned short),1,srcfile);
fread(&dbyte,sizeof(unsigned),1,srcfile);
acCodeHead->code=new char[length+1];
if(acCodeHead->code==NULL){
cout<<"空间不足"<<endl;
exit(1);
}
for(int i=length-1;i>=0;i--){
if((dbyte>>i)&1){
acCodeHead->code[length-i-1]='1';
}
else {acCodeHead->code[length-i-1]='0';}
}
acCodeHead->code[length]='\0';
acCodeHead->times=0; //将次数赋值为0
acCodeHead->next=NULL;
decodeListStruct* pacCode=acCodeHead; //工作指针
for(cltype i=0;i<acCodeListlength-1;i++)
{
dbyte=0;
length=0;
decodeListStruct* newacCode=new decodeListStruct; //新生成的节点
if(newacCode==NULL){
cout<<"空间不足"<<endl;
exit(1);
}
//srcfile.read((char*)&newacCode->ep.run,sizeof(unsigned short));
// srcfile.read((char*)&newacCode->ep.level,sizeof(btype));
// srcfile.read((char*)&length,sizeof(unsigned short));
// srcfile.read((char*)&dbyte,sizeof(unsigned));
fread(&newacCode->ep.run,sizeof(unsigned short),1,srcfile);
fread(&newacCode->ep.level,sizeof(btype),1,srcfile);
fread(&length,sizeof(unsigned short),1,srcfile);
fread(&dbyte,sizeof(unsigned),1,srcfile);
newacCode->code=new char[length+1];
if(newacCode->code==NULL){
cout<<"空间不足"<<endl;
exit(1);
}
for(int i=length-1;i>=0;i--){
if((dbyte>>i)&1){
newacCode->code[length-i-1]='1';
}
else {newacCode->code[length-i-1]='0';}
}
newacCode->code[length]='\0';
newacCode->times=0;
newacCode->next=NULL;
pacCode->next=newacCode; //新节点加入链表末尾
pacCode=newacCode; //工作指针移位至链尾
}
BinaryTree dcTree,acTree;
dcTree.CreateDC(dcCodeHead,dcCodeListlength);
acTree.CreateAC(acCodeHead,acCodeListlength);
/*--------------------------------------------直流反翻译------------------------------------------*/
blstype blocksize; //直流符号流长度
blstype dcCount=0; //对解码的直流差分值进行计数
Node* tempP=dcTree.root; //工作指针,初始化为指向树的根节点
if((tempP->lchild==NULL)&&(tempP->rchild==NULL)){
cout<<"DC解码树为空!"<<endl;
exit(1);
}
unsigned char buffer; //数据缓存
//srcfile.read((char*)&blocksize,sizeof(blstype));
fread(&blocksize,sizeof(blstype),1,srcfile);
dcDiff=new short [blocksize];
if(dcDiff==NULL){
cout<<"空间不足"<<endl;
exit(1);
}
//unsigned long srcfilecur=srcfile.cur;
//srcfile.read((char*)&buffer,1); //跳过换行符
//srcfile.read((char*)&buffer,1); //跳过换行符
while(dcCount<blocksize){
//srcfile.read((char*)&buffer,sizeof(unsigned char));
fread(&buffer,sizeof(unsigned char),1,srcfile);
if(!srcfile)break; //srcfile.eof()
for(int i=7;i>=0;i--){
if((tempP->lchild==NULL)&&(tempP->rchild==NULL)){
dcDiff[dcCount]=tempP->diffValue;
if (dcCount<blocksize-1)
dcCount++;
else {
dcCount++;
break;
}
tempP=dcTree.root; //完成一次查找,指针归位
if((buffer>>i)&1){ //当前此位的比较不可遗漏
tempP=tempP->rchild;
}
else {
tempP=tempP->lchild;
}
//continue;
}
else if((buffer>>i)&1){
tempP=tempP->rchild;
}
else {
tempP=tempP->lchild;
}
}
}
// for(int i=0;i<blocksize;i++)cout<<'['<<i<<"]:"<<dcDiff[i]<<'\t';
//int tempeof=srcfile.eof();
/*----------------------------------------交流反翻译--------------------------------------------*/
unsigned long acsl=12,acCount=0;
//srcfile.read((char*)&acsl,sizeof(unsigned long));
fread(&acsl,sizeof(unsigned long),1,srcfile);
tempP=acTree.root; //工作指针,初始化为指向树的根节点
if((tempP->lchild==NULL)&&(tempP->rchild==NULL)){
cout<<"AC解码树为空!"<<endl;
exit(1);
}
acSymbolHead=new symbolStreamStruct; //符号流头节点
if(acSymbolHead==NULL){
cout<<"空间不足"<<endl;
exit(1);
}
symbolStreamStruct *tempACSymbol=acSymbolHead; //符号流工作指针
while((srcfile)&&(acCount<acsl)){ //srcfile.eof()==0
//srcfile.read((char*)&buffer,sizeof(unsigned char));
fread(&buffer,sizeof(unsigned char),1,srcfile);
if(!srcfile)break; //srcfile.eof()!=0
for(int i=7;i>=0;i--){
if((tempP->lchild==NULL)&&(tempP->rchild==NULL)){
//dcDiff[dcCount]=tempP->diffValue;
//dcCount++;
tempACSymbol->e.run=tempP->Event.run;
tempACSymbol->e.level=tempP->Event.level;
symbolStreamStruct *newACSymbol=new symbolStreamStruct;
if(newACSymbol==NULL){
cout<<"空间不足"<<endl;
exit(1);
}
newACSymbol->next=NULL; //符号流链尾会有一个空节点
tempACSymbol->next=newACSymbol; //入链
tempACSymbol=newACSymbol;
if (acCount<acsl-1)
acCount++;
else {
acCount++;
break;
}
tempP=acTree.root; //完成一次查找,指针归位
if((buffer>>i)&1){ //当前此位的比较不可遗漏
tempP=tempP->rchild;
}
else {
tempP=tempP->lchild;
}
//continue;
}
else if((buffer>>i)&1){
tempP=tempP->rchild;
}
else {
tempP=tempP->lchild;
}
}
}
//srcfile.close();
fclose(srcfile);
/*-------------------------------------释放码表-------------------------------------*/
pdcCode=dcCodeHead->next;
while(pdcCode!=NULL){
delete []dcCodeHead->code;
//delete []dcCodeHead->code;
delete dcCodeHead;
dcCodeHead=pdcCode;
pdcCode=pdcCode->next;
}
delete []dcCodeHead->code;
delete dcCodeHead;
pacCode=acCodeHead->next;
while(pacCode!=NULL){
delete []acCodeHead->code;
//delete []acCodeHead->code;
delete acCodeHead;
acCodeHead=pacCode;
pacCode=pacCode->next;
}
delete []acCodeHead->code;
//delete []acCodeHead->code;
delete acCodeHead;
return width*height/64;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -