Java读取二进制文件Long变量字节序转换异常求助
问题排查与解决方案
核心错误原因
你要读取的目标值20577(十六进制0x5061)是2字节的无符号短整型,但你的代码错误地用8字节的long类型去读取,导致后面6个无效的0字节被解析进结果,最终得到带多余后缀的数值。
代码中的语法错误
先修正代码里的基础语法问题:
Static需改为小写staticthrow需改为throws(方法声明异常的关键字)ByteBuffer.wrap(byte)里的变量名错误,应为bytesreturn 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
相关产品推荐
相关产品推荐

