利用赫夫曼树加密压缩文件

因为鼠标落家里了,鼠标快递明天才到,所以明天再补充(5.23注释)

package copy.huffmantree;

import java.io.*;
import java.util.*;

/**
 * 一.把String字符转成ascii编码然后通过赫夫曼树生成唯一标识符。
 *
 *
 */
public class HuffmanDecode {
    public static void main(String[] args) {
       //srcFile是输入,dstFile是输出。
        String srcFile="E://src2.bmp";
        String dstFile="E://dst2.zip";
        //1、zipFile方法是压缩
        zipFile(srcFile,dstFile);
        System.out.println("压缩文件成功");
        //2、unZipFile是解压
//         unZipFile(dstFile,srcFile);
//        System.out.println("解压成功");
//        String content = "i like like like java do you like a java";
//        byte[] contentBytes = content.getBytes();
//        System.out.println(Arrays.toString(contentBytes));
//        byte[] huffmanCodesBytes = huffmanZip(contentBytes);
//        System.out.println("压缩后的编码"+Arrays.toString(huffmanCodesBytes));
//        //步骤5:解码的过程
//       deCode(huffmanCodes,huffmanCodesBytes);
//        byte[] sourceBytes = deCode(huffmanCodes, huffmanCodesBytes);
//        System.out.println(new String(sourceBytes));
        //getByte把字符变成字节ASCII码
//        System.out.println("1、getByte把字符变成字节ASCII码");
//        System.out.println(Arrays.toString(contentBytes));
//        List<Node1> nodes=getNodes(contentBytes);
//        System.out.println("2、把字节码按照个数转化权值遍历到List的Node结点中");
//        System.out.println(nodes);
//        System.out.println("3、创建赫夫曼树");
//        Node1 huffmanTree = createHuffmanTree(nodes);
//        preOrder(huffmanTree);
//        System.out.println("4、生成赫夫曼树对应的赫夫曼编码");
//        getCodes(huffmanTree,"",huffmanRoute);
//        System.out.println(huffmanCodes);
//        zip(contentBytes,huffmanCodes);


    }
    public static void unZipFile(String zipFile,String dstFile){
        InputStream is=null;
        ObjectInputStream ois=null;
        OutputStream os=null;
        try {
            // 初始化
            is = new FileInputStream(zipFile);
            // 初始化对象输入流 --- 用于读入 赫夫曼表和源文件数组
            ois = new ObjectInputStream(is);
            byte[] huffmanBytes = (byte[])ois.readObject();
            Map<Byte,String> h
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用赫夫曼树进行文件压缩的 C 语言示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_TREE_HT 100 typedef struct MinHeapNode { char data; unsigned freq; struct MinHeapNode *left, *right; } MinHeapNode; typedef struct MinHeap { unsigned size; unsigned capacity; MinHeapNode **array; } MinHeap; typedef struct HuffmanNode { char data; char *code; struct HuffmanNode *left, *right; } HuffmanNode; MinHeapNode* newMinHeapNode(char data, unsigned freq) { MinHeapNode* node = (MinHeapNode*) malloc(sizeof(MinHeapNode)); node->left = node->right = NULL; node->data = data; node->freq = freq; return node; } MinHeap* createMinHeap(unsigned capacity) { MinHeap* minHeap = (MinHeap*) malloc(sizeof(MinHeap)); minHeap->size = 0; minHeap->capacity = capacity; minHeap->array = (MinHeapNode**) malloc(minHeap->capacity * sizeof(MinHeapNode*)); return minHeap; } void swapMinHeapNode(MinHeapNode** a, MinHeapNode** b) { MinHeapNode* t = *a; *a = *b; *b = t; } void minHeapify(MinHeap* minHeap, int idx) { int smallest = idx; int left = 2 * idx + 1; int right = 2 * idx + 2; if (left < minHeap->size && minHeap->array[left]->freq < minHeap->array[smallest]->freq) smallest = left; if (right < minHeap->size && minHeap->array[right]->freq < minHeap->array[smallest]->freq) smallest = right; if (smallest != idx) { swapMinHeapNode(&minHeap->array[smallest], &minHeap->array[idx]); minHeapify(minHeap, smallest); } } int isSizeOne(MinHeap* minHeap) { return (minHeap->size == 1); } MinHeapNode* extractMin(MinHeap* minHeap) { MinHeapNode* temp = minHeap->array[0]; minHeap->array[0] = minHeap->array[minHeap->size - 1]; --minHeap->size; minHeapify(minHeap, 0); return temp; } void insertMinHeap(MinHeap* minHeap, MinHeapNode* minHeapNode) { ++minHeap->size; int i = minHeap->size - 1; while (i && minHeapNode->freq < minHeap->array[(i - 1) / 2]->freq) { minHeap->array[i] = minHeap->array[(i - 1) / 2]; i = (i - 1) / 2; } minHeap->array[i] = minHeapNode; } void buildMinHeap(MinHeap* minHeap) { int n = minHeap->size - 1; int i; for (i = (n - 1) / 2; i >= 0; --i) minHeapify(minHeap, i); } void printArr(int arr[], int n) { int i; for (i = 0; i < n; ++i) printf("%d", arr[i]); printf("\n"); } int isLeaf(MinHeapNode* root) { return !(root->left) && !(root->right); } MinHeap* createAndBuildMinHeap(char data[], int freq[], int size) { MinHeap* minHeap = createMinHeap(size); for (int i = 0; i < size; ++i) minHeap->array[i] = newMinHeapNode(data[i], freq[i]); minHeap->size = size; buildMinHeap(minHeap); return minHeap; } MinHeapNode* buildHuffmanTree(char data[], int freq[], int size) { MinHeapNode *left, *right, *top; MinHeap* minHeap = createAndBuildMinHeap(data, freq, size); while (!isSizeOne(minHeap)) { left = extractMin(minHeap); right = extractMin(minHeap); top = newMinHeapNode('$', left->freq + right->freq); top->left = left; top->right = right; insertMinHeap(minHeap, top); } return extractMin(minHeap); } void printCodes(MinHeapNode* root, int arr[], int top, HuffmanNode **huffmanTable) { if (root->left) { arr[top] = 0; printCodes(root->left, arr, top + 1, huffmanTable); } if (root->right) { arr[top] = 1; printCodes(root->right, arr, top + 1, huffmanTable); } if (isLeaf(root)) { HuffmanNode *node = (HuffmanNode*) malloc(sizeof(HuffmanNode)); node->data = root->data; node->code = (char*) malloc((top+1) * sizeof(char)); memcpy(node->code, arr, (top+1) * sizeof(char)); huffmanTable[node->data] = node; } } void HuffmanCodes(char data[], int freq[], int size, HuffmanNode **huffmanTable) { int arr[MAX_TREE_HT], top = 0; MinHeapNode* root = buildHuffmanTree(data, freq, size); printCodes(root, arr, top, huffmanTable); } void compressFile(char *inputFile, char *outputFile, HuffmanNode **huffmanTable) { FILE *inFile = fopen(inputFile, "r"); FILE *outFile = fopen(outputFile, "wb"); char c, byte = 0; int bitCount = 0; while ((c = fgetc(inFile)) != EOF) { HuffmanNode *node = huffmanTable[c]; for (int i = 0; i < strlen(node->code); i++) { byte <<= 1; byte |= node->code[i] - '0'; bitCount++; if (bitCount == 8) { fwrite(&byte, 1, 1, outFile); byte = 0; bitCount = 0; } } } if (bitCount > 0) { byte <<= (8 - bitCount); fwrite(&byte, 1, 1, outFile); } fclose(inFile); fclose(outFile); } int main() { char data[] = {'A', 'B', 'C', 'D', 'E', 'F'}; int freq[] = {5, 9, 12, 13, 16, 45}; int size = sizeof(data) / sizeof(data[0]); HuffmanNode *huffmanTable[256] = {NULL}; HuffmanCodes(data, freq, size, huffmanTable); char *inputFile = "input.txt"; char *outputFile = "output.bin"; compressFile(inputFile, outputFile, huffmanTable); return 0; } ``` 这个示例代码是以字符为单位进行压缩的,可以根据实际需要进行修改和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值