Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java LZW编码器-解码器-符号表_Java_Algorithm_Encoding_Compression_Lzw - Fatal编程技术网

Java LZW编码器-解码器-符号表

Java LZW编码器-解码器-符号表,java,algorithm,encoding,compression,lzw,Java,Algorithm,Encoding,Compression,Lzw,当我使用长度为256的符号表(字典)时,我的LZW压缩可以工作,编码器和解码器都可以使用256,一切都可以正常工作,但是当我将这个数字增加到例如512、1024、4096时,解码文件输出与第一个输入文件不一样…有什么提示吗 源代码: LZWEncoder.java: import java .io .*; public class LZWEncoder { public static void main ( String [] args ) throws File

当我使用长度为256的符号表(字典)时,我的LZW压缩可以工作,编码器和解码器都可以使用256,一切都可以正常工作,但是当我将这个数字增加到例如512、1024、4096时,解码文件输出与第一个输入文件不一样…有什么提示吗

源代码:

LZWEncoder.java:

import java .io .*;
public class LZWEncoder
{
    public static void main ( String [] args )
            throws FileNotFoundException , IOException
            {
        File file = new File ("calgary/book1");
        File fileOut = new File ( "calgary/book1_enc");
        FileInputStream reader = new FileInputStream ( file );
        FileOutputStream writer = new FileOutputStream ( fileOut );
        int size_st;
        long file_size;
        file_size = file.length();
        size_st = (int) file_size/1024;
        System.out.println("File size " + file_size + " Sysmbol tree" + size_st);

        if (size_st < 256)
            size_st = 256;
        else if (size_st < 512)
            size_st = 512;
        else if (size_st < 1024)
            size_st = 1024;
        else if (size_st < 2048)
            size_st = 2048;
        else
            size_st = 4096;

        byte[] size_stInBytes = (Integer.toString(size_st)+"\n").getBytes();
    //  writer.write(size_stInBytes);

        System.out.println("File size " + file_size + " Sysmbol tree " + size_st);

        // input stream with lookahead
        LookAheadIn in = new LookAheadIn ( file );
        LZWst st = new LZWst (4096); // specialised ST
        while (! in.isEmpty ())
        {
            int codeword = st.getput (in );
            writer.write ( codeword );
        }
        writer.close ();
        reader.close ();
            }
}
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Scanner;


public class LZWDecoder
{
    public static void main ( String [] args )
            throws FileNotFoundException , IOException
            {
        File file = new File ("calgary/book1_enc");
        Scanner first_line = new Scanner("calgary/book1_enc");
        File fileOut = new File ( "calgary/book1_dec2");
        FileInputStream reader = new FileInputStream ( file );
        FileOutputStream writer = new FileOutputStream ( fileOut );
        String size_st;
        size_st =first_line.nextLine();
        System.out.println(" Sysmbol tree " + size_st);
        String [] st = new String [4096];
        int i;
        for (i=0; i <128; i++)
            st[i] = Character.toString (( char ) i);

        String prev = "";
        int codeword ;
        while (( codeword = reader.read())!= -1)
        {

            String s;
            if ( codeword == i) // Tricky situation !
                s = prev + prev.charAt(0);
            else 
                s = st[codeword ];
            for (int j = 0; j<s.length(); j++)
                writer.write(s.charAt (j));
            if ( prev.length() > 0 && i < 4096 )
                st[i++] = prev + s.charAt(0);
            prev = s;
        }
        writer.close();
        reader.close();
            }
}

您正在读取字节,它们无法存储更大的值。如果要使用大于255的代码执行LZW,则需要对位流进行编码,或者为了进行测试(作为临时黑客),需要写入两个字节的字(大小为16的无符号整数)

替换

writer.write ( codeword );

然后检查它是否有效。如果是这样,您可以花一些时间实现基于位的流。您还需要更新读卡器和解码器

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class LookAheadIn
{
    private FileInputStream in = null ;
    private int last ;
    private boolean backup = true ;
    public LookAheadIn ( File file )
            throws FileNotFoundException , IOException
            {
        in = new FileInputStream ( file );
        last = in. read ();
        backup = true ;
            }
    public void backup () { backup = true ; }
    public int readChar () throws FileNotFoundException , IOException
            {
        if (! backup ) last = in. read();
        backup = false ;
        return last ;}
    public boolean isEmpty(){ return last == -1; }
}
writer.write ( codeword );
writer.write ( codeword>>8 );
writer.write ( codeword&0xff );