Я написал код для lzw algo в java. во время декомпрессии он переходит в бесконечный цикл. значения выше 255 считываются по-разному. im, давая ma-код с примером.lzw декомпрессии в java
import java.io.*;
import java.util.*;
public class test_decom {
static final int BUFFERSIZE = 32;
static final int CHARSIZE = 12;
static long buffer; //32 bits of space, up to 16bit compression, only 24 bits used
static int bufferBits; //How many bits are stored in the buffer
static int bits = 12; //How many bits per code
static int lzwSize; // have writen dis value at the end of compression file but this
//also not writing..... **plz help for this also**
static int getCode(InputStream fp)
{
long temp;
while(bufferBits <=(BUFFERSIZE - CHARSIZE *2))//Never go over than size - or we loose data
{ //Also never use full 64 bits, to avoid issues
//No point reading anymore, files done :p
try
{
System.out.print("bufferBits : ");
if(fp.available() <= 0)
break;
//test = fp.read();
//buffer |= test << bufferBits;
buffer |= fp.read() <<(bufferBits);
bufferBits+= CHARSIZE; //Buffer now stores one more char.
System.out.println(buffer);
}
catch(IOException e)
{
System.out.println("Error in getCode" + e.getMessage());
}
}
temp = (buffer << (64-bits)) >>> (64-bits); //We remove the excess bits
buffer >>>= bits; //Remove the bits from buffer
bufferBits -= bits;
System.out.println("temp : "+temp);
return (int)temp; //we return the correct code
}
public static void main(String arg[]) throws IOException
{
// int prefix[] = new int[20];
//int nextCode = 0;
// String dict[] = new String [20];
lzwSize = (short)(1<<(bits)-1);
BufferedInputStream fileIn = null;
BufferedOutputStream fileOut = null;
try
{
fileIn = new BufferedInputStream (new FileInputStream ("C:\\Documents and Settings\\project\\LzwTut\\test1_test.txt"));
fileOut = new BufferedOutputStream(new FileOutputStream("C:\\Documents and Settings\\gauri\\project\\practice\\LzwTut\\test1_Test.txt"));
}
catch(IOException e)
{
System.out.println("Unable to load file " + e.getMessage());
}
ArrayList<Integer> input = new ArrayList<Integer>();
Dictionary dic = new Hashtable();
String val = null;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int ab;
while((ab=getCode(fileIn))!=lzwSize){ //i tried putting -1 but that is also not working
//problem in this....
//initialization
input.add(ab);
}
// input.get(i) = Integer.parseInt(br.readLine());
for(int i=0;i<input.size()-1;i++)
//{
try{
if(input.get(i)<=255)
{
fileOut.write(input.get(i));
//System.out.println("output : "+input.get(i));
if(input.get(i+1)>255)
{
val = (String)dic.get(input.get(i+1)-256);
dic.put(i, input.get(i)+" "+val);
// System.out.println("dic.put("+i+", "+input[i]+" "+val+")");
}
else
{
dic.put(i, input.get(i)+" "+input.get(i+1));
//System.out.println("dic.put("+i+", "+input[i]+" "+input[i+1]+")");
}
// addDict(i,input[i],input[i+1]);//abhi tak out of bounds not solved
}
else
{
val = (String)dic.get(input.get(i)-256);
//System.out.print("output : ");
for(int k=0;k<val.length();k++)
{
if(val.charAt(k) == ' ')
continue;
else
{
fileOut.write(val.charAt(k));
// System.out.print(val.charAt(k));
}
}
// System.out.println();
if(input.get(i+1)>255)
{
String val1 = (String)dic.get(input.get(i+1)-256);
dic.put(i, val+" "+val1);
// System.out.println("dic.put("+i+", "+val+" "+val1+")");
}
else
{
dic.put(i, val+" "+input.get(i+1));
// System.out.println("dic.put("+i+", "+val+" "+input[i+1]+")");
}
}
}
catch(Exception e)
{}
if(input.get(input.size() - 1)>255)
{
//System.out.print("output : ");
for(int k=0;k<val.length();k++)
{
if(val.charAt(k) == ' ')
continue;
else
{
// System.out.print(val.charAt(k));
fileOut.write(val.charAt(k));
}
}
}
else{
//System.out.println("output : "+input.get(input.size() - 1));
fileOut.write(input.get(input.size() - 1));
}
try{
fileIn.close();
fileOut.close();
}
catch(Exception e)
{
}
// System.out.println("output : "+input[9]);
}
}
пример: TXT файл test_test.txt содержит: стека переполнение стека переполнения .......... после сжатия: ввода: 115 вход: 116 Выход: 115 вход: 97 выход: 116 вход: 99 выход: 97 вход: 107 выход: 99 вход: 32 выход: 107 ввод: 111 выход: 32 вход: 118 выход: 111 вход: 101 выход: 118 ввод: 114 выход: 101 inpu т: 102 Выход: 114 вход: 108 Выход: 102 ввод: 111 Выход: 108 вход: 119 Выход: 111 вход: 32 Выход: 119 вход: 105 Выход: 32 вход: 115 Выход: 105 вход : 32 выход: 115 вход: 98 выход: 32 вход: 101 utput: 98 вход: 115 выход: 101 вход: 116 вход: 32 выход: 256 вход: 102 выход: 32 вход: 111 выход: 102 ввод: 114 мощность: 111 ввод: 117 мощность: 114 ввод: 109 мощность: 117 вход: 46 Выход: 109 вход: 32 Выход: 46 вход: 115 Выход: 32 вход: 116 вход: 97 Выход: 256 вход: 99 вход: 107 Выход: 258 вход: 32 ввод: 111 выход: 260 ввода: 118 вход: 101 выход: 262 вход: 114 вход: 102 выход: 264 вход: 108 ввод: 111 выход: 266 вход: 119 вход: 46 выход: 268 строить успешные (общее время: 0 секунд) // предполагалось написать lzwSize, но он не пишет
после декомпрессии: выхода: 115 выхода: 116 выхода: 97 выхода: 99 выхода: 107 выхода: 32 выхода: 111 выхода: 118 выхода: 101 выхода: 114 выхода: 102 выход: 108 выход: 111 выход: 119 выход: 32 выход: 105 выход: 115 выход: 32 выход: 98 выход: 101
Что вы хотите сказать? –