@@ -6,7 +6,18 @@ bool Document::Encode() {
66 fseek (writer, 0 , 0 );
77 if (!reader || !writer)
88 return false ;
9- fwrite ( & FILEsize, 8 , 1 , writer);
9+ char FileSizeBit[65 ];
10+ memset (FileSizeBit,' 0' ,sizeof (FileSizeBit));
11+ FileSizeBit[64 ]=' \0 ' ;
12+ toBinary (FileSizeBit,FILEsize);
13+ for (int j=56 ;j>=0 ;j-=8 ){
14+ for (int i=0 ;i<8 ;i++){
15+ fprintf (writer," %c" ,FileSizeBit[i+j]);
16+ }
17+ fprintf (writer," " );
18+ }
19+ // fprintf(writer,"%s ",FileSizeBit);
20+ // fwrite( & FILEsize, 8, 1, writer);
1021 enCodingTree (top); // 写入树结构编码
1122 // /
1223 int buffer = 0 ;
@@ -18,36 +29,54 @@ bool Document::Encode() {
1829 for (int i = 0 ; i < strlen (str); i++) {
1930 bitStr[indic++] = str[i];
2031 if (indic == 8 ) { // 按8bit为一单位输出
21- int byte = toInt (bitStr);
22- fwrite ( & byte, 1 , 1 , writer);
32+ // int byte = toInt(bitStr);
33+ fwrite ( & bitStr, 8 , 1 , writer);
2334 strcpy (bitStr, " 00000000" );
2435 indic = 0 ;
36+ fprintf (writer," " );
2537 }
2638 }
2739 }
2840 }
2941 if (indic != 0 ) { // 最后一个字节不满8位则以0补足
30- int byte = toInt (bitStr);
31- if (fwrite ( & byte, 1 , 1 , writer) <= 0 ) return false ;
42+ // int byte = toInt(bitStr);
43+ if (fwrite ( & bitStr, 8 , 1 , writer) <= 0 ) return false ;
3244 }
3345 cout << " Finish. Check '" << FILEname << " '." << endl;
46+ cout<<FILEsize<<endl;
3447 return true ;
3548}
3649
3750// 对哈夫曼树进行编码
3851bool Document::enCodingTree (int top) {
3952 searchTree (top);
4053 //
41- fwrite ( & (++buff_t ), 1 , 1 , writer); // 写入首字节:树结构数组的大小
42- fwrite (buff, buff_t , 1 , writer); // 写入buff数组:存储树结构的
43- fwrite (bitSeq, bitSeq_p, 1 , writer); // 写入bitseq数组:按照DFS序,依次存储权值从大到小的字节叶子
54+ char _buff_t [9 ]=" 00000000" ;
55+ toBinary (_buff_t ,(++buff_t ));
56+ fprintf (writer," %s " ,_buff_t );
57+ // fwrite( & (++buff_t), 1, 1, writer); //写入首字节:树结构数组的大小
58+ // fprintf(writer,"%s",buff);
59+ for (int i=0 ;i<buff_t ;i++){
60+ char s[9 ]=" 00000000" ;
61+ toBinary (s,(int )buff[i]);
62+ fprintf (writer," %s " ,s);
63+ }
64+ // fwrite(buff, buff_t, 1, writer); //写入buff数组:存储树结构的
65+ for (int i=0 ;i<bitSeq_p;i++){
66+ char numBit[9 ]=" 00000000" ;
67+ toBinary (numBit,(int )bitSeq[i]);
68+ fwrite ( & numBit, 8 , 1 , writer);
69+ fprintf (writer," " );
70+ }
71+ // fwrite(bitSeq, bitSeq_p, 1, writer); //写入bitseq数组:按照DFS序,依次存储权值从大到小的字节叶子
4472 return true ;
4573};
4674
4775// 递归的DFS哈夫曼树,进行编码
4876void Document::searchTree (int now) {
4977 bool Cflag = (HuffmanTree[now][_left] == -1 ); // 判断是否有孩子
5078 buff[buff_t ] |= ((!Cflag) << buff_p--);
79+ // buff[buff_t]+='0';
5180 /*
5281 1.大端法,从左向右依次记录
5382 2.如果当前节点now有孩子,则Cflag为0 取反后将当前位置位1
@@ -64,4 +93,5 @@ void Document::searchTree(int now) {
6493
6594 searchTree (HuffmanTree[now][_left]);
6695 searchTree (HuffmanTree[now][_right]);
67- }
96+ }
97+
0 commit comments