解码二进制文件

时间:2014-02-10 13:50:17

标签: android

我使用以下代码来读取结构化二进制文件

FileInputStream objIS = new FileInputStream("/sdcard/waverider.usr");

DataInputStream objBR = new DataInputStream(objIS);
objwVer = objBR.readShort();
objwSVer = objBR.readShort();
objNoWaypoints = objBR.readShort();

System.out.println(objwVer);
System.out.println(objwSVer);
System.out.println(objNoWaypoints);
objIS.close();

这会产生结果: 512 0 8706

我追求的结果是 2 0 546

这是我使用VB.net获得的:

objwVer = objBR.ReadInt16
objwSVer = objBR.ReadInt16
objNoWaypoints = objBR.ReadInt16

二进制文件如下:

<00> 02 00 00 00 02 00 00 4b a9 c8 ff b2 2d 33 00

<00> 00 00 00 00 04 00 00 00 48 6f 6d 65 00 00 00 00

1c 68 53 0d 10 27 00 00 00 00 01 00 7e 8c c8 ff

我在这里遗漏了什么 9d 33 33 00 00 00 00 00 06 00 00 00

3 个答案:

答案 0 :(得分:3)

你的问题是这样的 你的文件是用小端byte order编写的,但是你的代码期望大端字节顺序。

答案 1 :(得分:0)

您的流以little-endian编码,DataInputStream仅支持big-endian。

您可以使用ByteBuffer代替,它允许解析little-endian格式化的流:http://developer.android.com/reference/java/nio/ByteOrder.html#LITTLE_ENDIAN

答案 2 :(得分:0)

尝试JBBP framework,它与Android兼容,其JBBPBitInputStream允许以不同的字节和位顺序读取数据

new JBBPBitInputStream(in).readInt(JBBPByteOrder.LITTLE_ENDIAN);