/*对文件进行编码*/ void toEncode(pNode root, FILE* input) { char filename[PATH_MAX] = { 0 }; FILE* output = NULL; printf(" *******************************\n"); printf(" $ 文件压缩 $\n"); printf("\n"); printf(" 输入要创建的文件名 : "); scanf("%s", filename); output = fopen(filename, "wb"); if (output) { int rawsize = countHuffmanTreeWeightTotal(root); int header_size = writeFileHeader(root, output); if (input) { int compressedsize = encodeFileData(root, input, output); printf("\n"); printf(" 文件头字符集 : %d Bytes\n", header_size); printf(" 压缩数据内容 : %d Bytes\n", compressedsize); printf(" 原始数据 : %d Bytes\n", rawsize); printf(" 压缩比 : %.2lf%%\n", (compressedsize / (double)rawsize) * 100); printf("\n"); printf(" 压缩完成.\n"); } else { printf(" 错误 : 读文件失败.\n"); } fclose(output); } else { printf(" 错误 : 写文件失败.\n"); } printf("\n"); }
时间: 2024-04-25 17:26:24 浏览: 53
这是一个文件压缩的函数,使用了哈夫曼编码算法来进行压缩。它会先要求用户输入要创建的压缩文件名,然后打开该文件并将哈夫曼编码树的头部信息写入文件中。接着,它将要压缩的文件数据进行编码,并将编码后的数据写入到压缩文件中。最后,该函数会输出一些统计信息,如文件头字符集大小、压缩数据大小、原始数据大小以及压缩比等。
相关问题
/*通过递归遍历将Huffman树转换成Huffman表*/ void convertTreeToList(pNode root, pNode nodelist[]) { if (root) { /*只获取有效字符节点*/ if (root->type == NODE_TYPE_DATA) { nodelist[root->data] = root; } convertTreeToList(root->left, nodelist); convertTreeToList(root->right, nodelist); } }
这段代码是用来将 Huffman 树转换成 Huffman 表的。其中,Huffman 树是一种用于数据压缩的树形结构,而 Huffman 表则是用于快速编解码的表格,可以将每个字符对应的编码存储在 Huffman 表中。这段代码通过递归遍历 Huffman 树,将每个有效字符节点的指针存储在一个数组中,这个数组就是 Huffman 表。在遍历过程中,只有当节点类型为数据节点时,才会将其存储在 Huffman 表中,这是因为只有数据节点才需要对应编码。
/*对文件数据进行Huffman编码*/ int encodeFileData(pNode root, FILE* input, FILE* output) { int total = 0; int count = 0; if (root) { Byte byte; int buffer = 0; pNode nodelist[LIST_SIZE] = { NULL }; /*将Huffman树转换成Huffman表*/ convertTreeToList(root, nodelist); while (fread(&byte, sizeof(byte), 1, input) == 1) { char* cursor = nodelist[byte]->code; while (*cursor) { buffer <<= 1; if (*cursor == '0') { buffer |= 0; } else { buffer |= 1; } ++count; if (count == 8) { Byte byte = (Byte)buffer; fwrite(&byte, sizeof(byte), 1, output); count = 0; buffer = 0; ++total; } ++cursor; } } if (count > 0) { buffer <<= (8 - count); char byte = (char)buffer; fwrite(&byte, 1, 1, output); ++total; } } return total; }
这段代码是用来对文件数据进行Huffman编码的。它使用了Huffman表,将输入文件中的每个字节转换成对应的Huffman编码,并将编码后的结果写入输出文件中。
首先,这段代码定义了一个变量total,用来记录编码后的字节数。接着,它定义了一个缓冲区buffer和一个计数器count,用来临时存储编码后的数据。然后,它调用了convertTreeToList函数,将Huffman树转换成Huffman表,以便于编码时查找每个字节对应的Huffman编码。
在主循环中,它使用fread函数从输入文件中读取一个字节,并调用Huffman表中对应字节的节点,得到该字节对应的Huffman编码。然后,它将编码中的每一位依次存入缓冲区buffer中。当缓冲区中的位数达到8位时,将缓冲区中的数据写入输出文件,并将计数器count和缓冲区buffer清零。最后,如果还有剩余的位数,将其补齐到8位并写入输出文件。整个过程重复直到输入文件中的所有字节都被编码。
最终,这段代码返回编码后的字节数total。
阅读全文