2013-03-25 4 views
-2

Я написал код для 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

+2

Что вы хотите сказать? –

ответ

0
while((ab=getCode(fileIn))!=lzwSize)// I think here is the problem 

должен быть

while((ab=getCode(fileIn))<=lzwSize) 

Потому что может быть (Получить код fileIn) никогда не вернется lzSize, и он будет зацикливается. Я не знаю, что дезинформация lzw просто угадывает, просматривая ваш код.

+0

он выйдет за пределы, если я делаю для (int i = 0; i user2159239

Смежные вопросы