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

Java读取二进制文件Long变量字节序转换异常求助

问题排查与解决方案

核心错误原因

你要读取的目标值20577(十六进制0x5061)是2字节的无符号短整型,但你的代码错误地用8字节的long类型去读取,导致后面6个无效的0字节被解析进结果,最终得到带多余后缀的数值。

代码中的语法错误

先修正代码里的基础语法问题:

  • Static 需改为小写 static
  • throw 需改为 throws(方法声明异常的关键字)
  • ByteBuffer.wrap(byte) 里的变量名错误,应为 bytes
  • return byteBuffer.getLong() 末尾缺少分号 ;

修正后的错误代码(仅改语法,逻辑仍有问题):

static long extractLong(DataInputStream dis) throws IOException {
    byte[] bytes = new byte[8];
    dis.read(bytes);
    ByteBuffer byteBuffer = ByteBuffer.wrap(bytes);
    byteBuffer.order(ByteOrder.LITTLE_ENDIAN);
    return byteBuffer.getLong();
}

正确解决方案

根据目标值的字节长度(2字节),调整读取逻辑:

情况1:文件中该数值以小端序存储

如果文件里的字节是0x61、0x50(小端序:低字节在前),读取2字节后转换为对应数值:

static int extractTargetValue(DataInputStream dis) throws IOException {
    // 读取2字节
    byte[] bytes = new byte[2];
    dis.read(bytes);
    // 小端序解析:低字节是bytes[0],高字节是bytes[1]
    return ((bytes[1] & 0xFF) << 8) | (bytes[0] & 0xFF);
}

解析逻辑:bytes[0]是低8位(0x61),bytes[1]是高8位(0x50),组合后得到0x5061即20577。

情况2:文件中该数值以大端序存储

如果文件里的字节是0x50、0x61(大端序:高字节在前),读取2字节后转换:

static int extractTargetValue(DataInputStream dis) throws IOException {
    byte[] bytes = new byte[2];
    dis.read(bytes);
    // 大端序解析:高字节是bytes[0],低字节是bytes[1]
    return ((bytes[0] & 0xFF) << 8) | (bytes[1] & 0xFF);
}

或者直接用DataInputStream的内置方法(默认大端序):

static int extractTargetValue(DataInputStream dis) throws IOException {
    // readUnsignedShort()默认按大端序读取2字节,返回无符号的int值
    return dis.readUnsignedShort();
}

验证逻辑

你可以打印读取到的2字节数组内容,确认文件中的实际字节:

byte[] bytes = new byte[2];
dis.read(bytes);
System.out.printf("字节1:0x%02X,字节2:0x%02X%n", bytes[0] & 0xFF, bytes[1] & 0xFF);

如果输出是字节1:0x61,字节2:0x50,用小端解析;如果是字节1:0x50,字节2:0x61,用大端解析。

内容的提问来源于stack exchange,提问作者Haydn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.01 13:17:34