現在、テキストファイルを圧縮/解凍するためにハフマンツリーを使用しています。現在私の問題は、バイトを書き込んでそれらを読むとき、私は自分の数字の先頭の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();
}
}
}
私はそれは問題の少し長いです知っているが、任意のヘルプは大歓迎です!
問題は「Integer.toBinaryString」と同じように聞こえます。 –
@LouisWasserman問題の原因を説明してもらえますか?私はなぜこれらの0を失っているのか理解しようとしています。何らかのパディング/ビットシフトを行う必要がありますか? –
これは、数字やパディングやビットシフト、そして 'int 'から0と1のシーケンスへの変換の手段としての' Integer.toBinaryString'の選択に関係することはありません。 'Integer.toBinaryString'は先行ゼロをまったく生成しません。 –