2017-04-20 24 views
0

現在、テキストファイルを圧縮/解凍するためにハフマンツリーを使用しています。現在私の問題は、バイトを書き込んでそれらを読むとき、私は自分の数字の先頭の0を失うということです。Integer.toBinaryString()先行0を失う

私のOutputStreamクラスでは、私のwriteBit()メソッドは、一度に1ビットを供給し、ビット数が8に達すると、そのバイトをファイルに書き込みます。実際にビットを書き込むときに問題が発生しますが、現在、この2進数を作成するためにStringを使用しています。

HuffmanOutputStream.java:私はInteger.parseInt(バイト、2)を使用する場合が

/** 
* Created by Sully on 3/20/2017. 
*/ 

import java.io.IOException; 


public class HuffmanOutputStream extends BitOutputStream { 

private int count = 0; 
private String bytes = ""; 

public HuffmanOutputStream(String filename, String tree, int totalChars) { 
    super(filename); 
    try { 
     d.writeUTF(tree); 
     d.writeInt(totalChars); 
    } catch (IOException e) { 
    } 
} 

public void writeBit(int bit) { 
    //PRE bit == 0 || bit == 1 
    if (count < 8) { 
     bytes += bit; 
     count++; 
    } 
    try { 

     if (count == 8) { 
      d.writeByte(Integer.parseInt(bytes, 2)); 
      count = 0; 
      bytes = ""; 
     } 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 


public void close() { 

} 
} 

物事がうまくいかないときの例は、私のテキストファイルのために、私が構築最初のバイトは、01100001です与えられた整数は97であり、2進数として読み取られると、1100001だけが返されます。ハフマン・ツリーはこれらの0が含まれることに依存しているので、どうすればこの位置に保持できますか?また、0が残るように正しく読み込まれていることを確認するには?

HuffmanInputStream.java:

/** 
* Created by Sully on 3/20/2017. 
*/ 

import java.io.IOException; 

public class HuffmanInputStream extends BitInputStream { 
    private String tree; 
    private int totalChars; 

    private int currentByte; 
    private int bitCount; 
    private static final int BYTE_SIZE = 8; 
    private int[] bufferedBits = new int[BYTE_SIZE]; 


public HuffmanInputStream(String filename) { 
    super(filename); 

    try { 
     tree = d.readUTF(); 
     totalChars = d.readInt(); 
     currentByte = 0; 
     bitCount = 8; 

    } catch (IOException e) { 
    } 
} 


public int readBit() { 

    if (currentByte == -1) { 
     return -1; 
    } 


    if (bitCount == 8) { 
     try { 
      currentByte = d.read(); 
      if(currentByte == -1){ 
       return -1; 
      } 
      String binary = Integer.toBinaryString(currentByte); 
      for (int x = 0; x < binary.length(); x++) { 
       bufferedBits[x] = Character.valueOf(binary.charAt(x)); 
      } 
      bitCount = 0; 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

    } 

    int val = bufferedBits[bitCount]; 

    bitCount++; 

    return val % 2; 


} 

public String getTree() { 
    return tree; 
} 

public int totalChars() { 
    return totalChars; 
} 

public void close() { 
    try { 
     d.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 
} 

私はそれは問題の少し長いです知っているが、任意のヘルプは大歓迎です!

+0

問題は「Integer.toBinaryString」と同じように聞こえます。 –

+0

@LouisWasserman問題の原因を説明してもらえますか?私はなぜこれらの0を失っているのか理解しようとしています。何らかのパディング/ビットシフトを行う必要がありますか? –

+1

これは、数字やパディングやビットシフト、そして 'int 'から0と1のシーケンスへの変換の手段としての' Integer.toBinaryString'の選択に関係することはありません。 'Integer.toBinaryString'は先行ゼロをまったく生成しません。 –

答えて

2

0は、Stringの長さをInteger#toBinaryStringから8に戻すのに十分な余裕があると思っています。次のコードでこれを実現します:

String binary = String.format("%8s", Integer.toBinaryString(currentByte)).replace(' ', '0'); 
+0

ありがとう!私はあなたが答えたように、この権利に似た別の解決策を見つけました。再度、感謝します。 –

+0

あなたは大歓迎です! –

関連する問題