You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 13:07:48