我正在读取一个二进制文件,其中数字数据以16位格式存储。当这个文件被读取visual c ++程序时,它工作正常,但是当我使用下面的java代码时,我无法获得所需的结果,输出似乎是垃圾值。我正在使用RandomAccessFile
,你可以看到。但我得到了绝对荒谬的价值观。更重要的是,我有浮点值存储在此文件中,但即使我使用readFloat()
,readInt()
或readShort()
,我也无法获得所需的结果。请指出我哪里出错了。 文件中的前10个字节:01100000 00000000 00100011 00100000 11000000 00100011 11000001 00100010 10111111 00100001。各位感谢您抽出时间
public class Test {
public static void main(String[] args) throws IOException {
RandomAccessFile data = new RandomAccessFile("D:\\RawEEGData.bin","r");
try {
while(data != null) {
// i have tried readFloat(), readShort() and readInt()
// but none of them seems to be working
float myInt16 = data.readFloat();
System.out.printf(" %f\n", myInt16);
}
} finally {
if (data != null) { data.close(); };
}
}
}
答案 0 :(得分:0)
它看起来像一个字节序问题。如果您的同事使用ReadInt16,那么这些数字不是浮点数。试试这个:
byte b0 = data.readByte();
byte b1 = data.readByte();
int i = (((int)b1)<<8) + b0;
System.out.print(" int value : " + i);
编辑:如果这不起作用,请编辑您的问题,将8个第一个字节显示为10101000 01...
或hexa
答案 1 :(得分:0)
您需要澄清 int16 数据到底是什么:
除非您知道数据的形式,否则您将无法正确解释它。根据它的结果,RandomAccessFile上提供的方法可能没用,因为它们只涵盖java中常用的格式。
问题很可能是VC ++以平台依赖顺序存储数据,而Java总是使用大端字节顺序(也就是网络字节顺序)。