gpt4 book ai didi

java - Integer.toBinaryString() 丢失前导 0

转载 作者:行者123 更新时间:2023-12-02 02:52:59 24 4
gpt4 key购买 nike

我目前正在使用霍夫曼树来压缩/解压缩文本文件。目前我的问题是,当写入字节并读取它们时,我丢失了数字中的任何前导 0。

在我的 OutputStream 类中,我的 writeBit()方法中,我一次输入一位,当我的位数达到 8 时,我将字节写入文件。目前使用字符串来构建这个二进制数,尽管在实际写入该位时会出现问题。

霍夫曼输出流.java:

/**
* 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,尽管当我使用 Integer.parseInt(byte,2) 时,给出的整数是 97,然后读取该整数作为二进制数,仅返回 1100001。由于霍夫曼树依赖于包含这些 0,我怎样才能保留这个 0?还要确保正确读取并保留 0?

霍夫曼输入流.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 返回的 String 的长度> 8;以下代码将为您实现此目的:

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

关于java - Integer.toBinaryString() 丢失前导 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43525844/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com