我正在使用生成的霍夫曼代码压缩文本文件然后我将所有字符转换为0和1的字符串。使用以下代码在文件中写入它们。 (输入为1011001110010011
)
public static void writeToFile(String binaryString, BufferedWriter writer) throws IOException{
int pos = 0;
while(pos < binaryString.length()){
byte nextByte = 0x00;
for(int i=0;i<8 && pos+i < binaryString.length(); i++){
nextByte = (byte) (nextByte << 1);
nextByte += binaryString.charAt(pos+i)=='0'?0x0:0x1;
}
writer.write(nextByte);
pos+=8;
}
}
然后我尝试使用以下代码从我刚创建的文件中重新生成以前的二进制字符串1011001110010011
data = Files.readAllBytes(path);
for(int i=0;i<data.length;i++){
byte nextByte = data[i];
String tempString = "";
for(int j=0;j<8; j++){
byte temp = (byte) (0x1 & nextByte);
if(temp==0x1){
tempString="1".concat(tempString);
}else if(temp==0x0){
tempString="0".concat(tempString);
}
nextByte = (byte) (nextByte >> 1);
}
binary=binary.concat(tempString);
}
但我在输出中得到111011111011111010110011111011111011111010010011
,我只是期待一些附加的0。
编辑:从字符串到二进制代码进行了更改,现在它在结束时将0添加到完成字节。
public static void writeToFile(String binaryString, BufferedWriter writer) throws IOException{
int pos = 0;
while(pos < binaryString.length()){
byte nextByte = 0x00;
for(int i=0;i<8; i++){
nextByte = (byte) (nextByte << 1);
if(pos+i < binaryString.length())
nextByte += binaryString.charAt(pos+i)=='0'?0x0:0x1;
}
writer.write(nextByte);
pos+=8;
}
}
答案 0 :(得分:2)
问题是BufferedWriter.write()
写了char
,而不是byte
。无论何时您正在写文件,您都要编写一个可变大小的unicode字符,而不是一个byte
,因此您最终会在文件中存储的内容比您更多期待着。
您想要使用
new BufferedOutputStream(new FileOutputStream("filename"))
而是更改方法的签名以采用OutputStream
。
(您可能会注意到OutputStream.write()
需要int
而不是byte
,但这只会让您感到困惑......它实际上只会写低位字节,而不是整个int
,所以它做你想要的。)