Skip to content

Commit 022e269

Browse files
authored
Merge pull request #13 from NoUITeam/test
For web. **.txt only.
2 parents 69bc395 + 0e532b6 commit 022e269

23 files changed

Lines changed: 3772 additions & 131 deletions

Decode.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,18 @@
44
bool Document::Decode() {
55
long long data = 0;
66
int flag = TOP_NUM;
7-
int buffer = 0;
7+
unsigned char buffer[9]="00000000";
88
while (!feof(reader)) {
9-
if (fread( & buffer, 1, 1, reader) <= 0 && !feof(reader)) //如果读取失败,则返回错误
9+
if (fread( & buffer, 8, 1, reader) <= 0 && !feof(reader)) //如果读取失败,则返回错误
1010
return false;
1111
if(feof(reader)){
1212
cout << "Finish. Check '" << FILEname << "'." << endl;
1313
return true;
1414
}
15-
char bits[9] = "00000000";
16-
toBinary(bits, buffer);
15+
fseek(reader,1,SEEK_CUR);
1716
///8bit合并输出
1817
for (int i = 0; i < 8; i++) {
19-
flag = HuffmanTree[flag][bits[i] == '0' ? _left : _right]; //按bit读取到0,向左子树找;否则向右子树找
18+
flag = HuffmanTree[flag][buffer[i] == '0' ? _left : _right]; //按bit读取到0,向左子树找;否则向右子树找
2019
if (HuffmanTree[flag][_left] == -1 && HuffmanTree[flag][_right] == -1) { //判断是否是叶子节点,若是则写入叶子节点编号
2120
if (fwrite( & flag, 1, 1, writer) <= 0)
2221
return false;
@@ -32,3 +31,4 @@ bool Document::Decode() {
3231
return false;
3332
}
3433

34+

Document.cpp

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,12 @@ Document::Document(string filePath, string fileName) {
66
FILEpath = filePath.c_str();
77
FILEname = fileName.c_str();
88
reader = writer = NULL;
9-
reader = fopen(FILEpath, "rb");
9+
reader = fopen(FILEpath, "r");
1010
writer = fopen(FILEname, "wb");
1111
//
1212
top = TOP_NUM;
1313
FILEsize = buff_t = bitSeq_p = 0;
14-
buff_p=7;
14+
buff_p =7;
1515
memset(buff, 0, sizeof(buff));
1616
memset(bitSeq, 0, sizeof(bitSeq));
1717
//
@@ -97,13 +97,14 @@ bool Document::HTreeCreate() {
9797
HuffmanTree[node1][_parent] = HuffmanTree[node2][_parent] = flag;
9898
HuffmanTree[flag][_left] = node1;
9999
HuffmanTree[flag][_right] = node2;
100-
if (!Nodes.empty())
101-
Nodes.push(Node(flag, new_weight, 256)); //新节点入堆
100+
if (!Nodes.empty())
101+
Nodes.push(Node(flag, new_weight, 256)); //新节点入堆
102102
top = flag;
103103
flag++;
104104
}
105-
//记录文件大小(/字节)
106105
FILEsize = HuffmanTree[top][_weigth];
106+
//记录文件大小(/字节)
107+
107108
return true;
108109
}
109110

Encode.cpp

Lines changed: 39 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -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
//对哈夫曼树进行编码
3851
bool 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哈夫曼树,进行编码
4876
void 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+

HuffmanCoding.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,4 +65,4 @@ class Document{
6565
int toInt(char* bit);
6666
void toBinary(char* binary,int num);
6767
};
68-
#endif
68+
#endif

Main.cpp

Lines changed: 3 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,9 @@
11
#include "HuffmanCoding.h"
22

3-
int main(){
3+
int main(int argc,char* argv[]){
44
int mode = 0 , mode_2 = 0;
5-
cout<<"Enter 0 to encode,1 to decode and -1 to exit.\nMode:";
6-
scanf("%d",&mode);
7-
while(mode!=-1){
8-
// Readin process.
9-
string filePath,fileName;
10-
cout<<"Enter name or path of source file: ";
11-
cin>>filePath;
12-
if(mode!=2){
13-
cout<<"Enter export file name: ";
14-
cin>>fileName;
15-
}else{
16-
fileName="__out";
17-
}
5+
mode=(argv[1][0]-'0');
6+
string filePath="in.txt",fileName="out.txt";
187
/////////////////////////////////////////////////////////////////
198
Document File(filePath,fileName); //Construct FILE.
209
switch(mode){
@@ -28,22 +17,6 @@ int main(){
2817
if(!File.Decode())
2918
cout<<"Invalid CodeTree. Check your file."<<endl;
3019
}break;
31-
case 2:
32-
cout<<"Enter check_Mode:";
33-
cin>>mode_2;
34-
if(File.Init(mode_2)){
35-
cout<<"HuffmanTree check for mode:"<<mode_2<<endl;
36-
File.checkTree();
37-
}break;
38-
default:
39-
cout<<"Invalid mode number. Check your input."<<endl;
4020
}
41-
Sleep(300);
42-
cout<<"Enter 0 to encode,1 to decode and -1 to exit.\nMode:";
43-
scanf("%d",&mode);
44-
}
45-
cout<<"\nSee you next time."<<endl;
46-
cout<<"\n--Made by @NoUITeam.\n--Website: https://github.com/NoUITeam"<<endl;
47-
Sleep(2000);
4821
return 0;
4922
}

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,3 +17,4 @@
1717
**[info]** 2021-12-02 Program for web. **.txt files only.
1818

1919
**[info]** 2021-12-02 Fix some bugs.
20+

Readin.cpp

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,25 +11,37 @@ bool Document::ReadinSource() {
1111
if(feof(reader)) return true;
1212
BytecodeArray[buffer]++;
1313
}
14+
1415
return true;
1516
}
1617

1718
//读取已解码文件
1819
//从文件中读入头部分,进行解码并还原树
1920
bool Document::ReadinCode() {
20-
int head_t = 0;
2121
int _top = TOP_NUM;
2222
memset(buff, 0, sizeof(buff));
23-
if (fread( & FILEsize, 8, 1, reader) <= 0) return false; //读取文件大小(字节数)
24-
if (fread( & head_t, 1, 1, reader) <= 0) return false; //读入首字节:树结构数组的大小
25-
if (fread( & buff, 1, head_t, reader) <= 0) return false; //读入树结构数组.此后fp位于首个字节叶子
23+
char reading[9]="00000000";
24+
for(int i=0;i<8;i++){
25+
if(fread(&reading,8,1,reader) <= 0) return false;
26+
FILEsize+=toInt(reading)*pow(2,8*i);
27+
fseek(reader,1,SEEK_CUR);
28+
}
29+
if (fread( & reading, 8, 1, reader) <= 0) return false; //读入首字节:树结构数组的大小
30+
int head_t=toInt(reading);
31+
fseek(reader,1,SEEK_CUR);
32+
for(int i=0;i<head_t;i++){
33+
if(fread(&reading,8,1,reader) <= 0) return false;
34+
fseek(reader,1,SEEK_CUR);
35+
buff[i]=toInt(reading);
36+
}
37+
//读入树结构数组.此后fp位于首个字节叶子
2638
RebuildTree(_top); //构建树
2739
return true;
2840
}
2941

3042
//DFS遍历,建立哈夫曼树.返回当前节点是否为字节叶子
3143
bool Document::RebuildTree(int & now) {
32-
unsigned char t = 0;
44+
//int t = 0;
3345
int _now = now;
3446
bool Cflag = (buff[buff_t] & (1 << buff_p--)); //判断是否有孩子
3547
if (buff_p == -1)
@@ -39,14 +51,19 @@ bool Document::RebuildTree(int & now) {
3951
return true;
4052
} //当前是字节叶子节点.
4153
HuffmanTree[_now][_left] = ++now;
54+
4255
if (RebuildTree(now)) { //如果是字节叶子节点,则顺序读入一个字节叶子数据
43-
if (fread( & t, 1, 1, reader) <= 0) return false;
44-
HuffmanTree[_now][_left] = t;
56+
char node[9]="00000000";
57+
if (fread( & node, 8, 1, reader) <= 0) return false;
58+
fseek(reader,1,SEEK_CUR);
59+
HuffmanTree[_now][_left] = toInt(node);
4560
}
4661
HuffmanTree[_now][_right] = ++now;
4762
if (RebuildTree(now)) {
48-
if (fread( & t, 1, 1, reader) <= 0) return false;
49-
HuffmanTree[_now][_right] = t;
63+
char node[9]="00000000";
64+
if (fread( & node, 8, 1, reader) <= 0) return false;
65+
fseek(reader,1,SEEK_CUR);
66+
HuffmanTree[_now][_right] = toInt(node);
5067
}
5168
return false;
5269
}

build/.cmake/api/v1/reply/index-2021-12-02T14-23-59-0753.json renamed to build/.cmake/api/v1/reply/index-2021-12-02T14-40-54-0318.json

File renamed without changes.
0 Bytes
Binary file not shown.
0 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)