繁体   English   中英

霍夫曼编码解码器 - 发送编码器字典

[英]Huffman code decoder - send a dictionary of encoder

嗨,我是一名计算机科学专业的学生 - 在我的第二年。 在我学习期间,他们让我做一个项目。 构建霍夫曼代码。 我构建的大部分代码对我来说效果很好。 但是我几乎没有卡住,我构建的编码器很好,但是解码器给我带来了问题。

编码工作正常。 编码是根据每个字符的字典完成的。 解码也需要这个字典。 我的问题是如何将字典传递给解码器——而不改变原始函数的签名。

我的困难是实现解码器 - 不改变讲师设置的 4 个功能。 只要结构保持不变,我可以为原来的 4 个函数添加任意数量的函数。

编码器 - 接收文件 - 并将其转换为字节 - 进行压缩。 它遍历原始文件,计算每个字符的印象数,然后为每个字符构建一个带有代码的树。

解码器 - 需要获取树 - 将字节转换为原始文件 - 我在这里卡住了。 如何从编码器发送解码器的树。

该代码具有预定义的类和功能 - 根据讲师的说明。 我将无法将签名更改为函数。 但是,我可能会创建一些我想要的功能。

不可更改的功能:

public class HuffmanEncoderDecoder implements Compressor
{

    public HuffmanEncoderDecoder()
    {
        // TODO Auto-generated constructor stub
    }

    @Override
    public void Compress(String[] input_names, String[] output_names)
    {
        // TODO Auto-generated method stub

    }

    @Override
    public void Decompress(String[] input_names, String[] output_names)
    {
        // TODO Auto-generated method stub

    }

    @Override
    public byte[] CompressWithArray(String[] input_names, String[] output_names)
    {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public byte[] DecompressWithArray(String[] input_names, String[] output_names)
    {
        // TODO Auto-generated method stub
        return null;
    }

}

我已经实现的代码

    public static void main(String[] args) {

        String[] input_names = {"C:\\Documents\\files-huffman\\check.txt"};
        String[] output_names = {"C:\\Documents\\files-huffman\\out.txt"};
        HuffmanEncoderDecoder objectHuffman = new HuffmanEncoderDecoder();
        objectHuffman.Compress(input_names, output_names);
        //how to send to the objectHuffman.Decompress the tree or the map of codes

check.txt 包含:abra cadabra out.txt 包含:0110111010101011010001101110

我只构建了第一个编码文件的 function。 以及帮助我编码的辅助函数 - 例如计算输入文件中字符数的 function 和构建并返回树的 function

我的问题是编码文件后如何 - 我可以根据项目条款对其进行解码? 谢谢您的帮助。

我只构建了第一个编码文件的 function。 以及帮助我编码的辅助函数 - 例如计算输入文件中字符数的 function 和构建并返回树的 function

在论坛帮助之后,我能够将树从编码器移动到解码器。 我将树添加到一个文件中,然后在解码器中创建了一个新树。

我添加了我编写的代码: 代码显示我正在移动的树 - 是一棵空白树 - 但它不可能 - 因为编码工作正常。

为了移动 map - 我创建了 2 个函数,readTreeFile 和 writeTreeFile。 一个在编码器中工作 - map 被复制到一个文件中。 第二个工作解码器 - 它从文件中提取 map。

public static Map<Character, String> readTreeFile (String[] output_names)
{
    Map<Character, String> codes = new HashMap<>();
    try {
        FileInputStream f = new FileInputStream(output_names[1]);
        ObjectInputStream s = new ObjectInputStream(f);
        codes = (HashMap<Character, String>) s.readObject();
        s.close();
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
    return codes;
}
public static void writeTreeFile (Map<Character, String> codes , String[] output_names)
{
    try {
        FileOutputStream f = new FileOutputStream(output_names[1]);
        ObjectOutputStream s = new ObjectOutputStream(f);
        s.writeObject(codes);
        s.close();
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM