Java开发Huffman解码器遇文件比特读取错误,大量字节显示为11111101求助
问题根源与解决方案:字符流读取二进制文件导致比特序列错误
核心问题
你用FileReader/BufferedReader这类字符流读取二进制文件是完全错误的。字符流是为处理文本数据设计的,它会自动把文件字节按JVM默认字符编码(比如UTF-8)转成字符。你的测试文件里存在不符合该编码的字节(例如10011011、11100110),这些字节会被替换成Unicode替换字符�(U+FFFD),其低8位二进制就是11111101,这正好对应你看到的错误输出。
修复方案
改用字节流读取原始二进制数据——Huffman解码需要的是文件的原始比特序列,而非经过编码转换的字符。修改后的代码如下:
替换字符流为字节流
public static void main(String[] args) { // 替换原字符流为字节流 try (FileInputStream fis = new FileInputStream(property); BufferedInputStream bis = new BufferedInputStream(fis)) { printRemainingBits(bis); } catch (IOException e) { e.printStackTrace(); } } static void printRemainingBits(BufferedInputStream bis) throws IOException { System.out.println("\nRemaining Bits:"); int b; // 读取原始字节,范围0-255 while ((b = bis.read()) != -1) { printByteBits(b); } } public static void printByteBits(int b) { // 直接处理字节的8位比特 for (int i = 7; i >= 0; i--) { int bit = (b >> i) & 1; System.out.print(bit); } System.out.print(" "); }
关键说明
FileInputStream会直接读取文件的原始字节,不做任何编码转换,能保证拿到和第三方软件一致的比特序列。- 读取的
int值范围是0到255(对应一个字节的无符号值),彻底避免了字符转换带来的替换问题。 - 使用try-with-resources语法可自动关闭流,无需手动调用
close(),更安全简洁。
内容的提问来源于stack exchange,提问作者witw2
相关产品推荐
相关产品推荐

