Java从二进制结构文件中读取错误的值

时间:2014-08-04 13:59:12

标签: java file delphi structure endianness

我有一个由Delphi记录组成的文件。记录如下:

TPoint = record
    X, Y: Double;
end;

据我所知,Delphi将数据存储为LittleEndian,Java存储为BigEndian,因此read方法如下:

public Point readPoint() throws IOException {
        double x = Double.longBitsToDouble(
                                Long.reverseBytes(
                                        Double.doubleToLongBits(in.readDouble()
                                        )
                                )
        );
        double y = Double.longBitsToDouble(
                Long.reverseBytes(
                        Double.doubleToLongBits(in.readDouble()
                        )
                )
        );
        return new Point(x, y);
}

一切似乎都很好,但有时我会收集损坏的数据。我得到了

638 offset: 10256   Point{x=3.143E-319, y=48.47134}

但是应该得到

638 offset: 10256   Point{x=22.25315, y=48.47134}

当我打开文件并查看偏移量为10256的数据时,我看到:

  

7F FB 3A 70 CE 40 36 40

在LittleEndian中是22.25315。所以我想知道问题是什么? Long.reverseBytes()方法有什么问题吗?或者将任何双打从LE转换为BE是不可能的,反之亦然?

2 个答案:

答案 0 :(得分:4)

我怀疑可能的问题是因为当他们是一个大端双重时,你正在读取8个字节作为大端double 。鉴于位在double中具有特定含义,可能会导致问题 - 例如,Java可能会使NaN值正常化。这有点像使用您知道不正确的编码来读取文本数据,然后将其转换回字节...

如果您将值读作long开始,那么应该保留所有位,这样您就可以反转字节,然后然后转换为double

double x = Double.longBitsToDouble(Long.reverseBytes(in.readLong()));
double y = Double.longBitsToDouble(Long.reverseBytes(in.readLong()));

答案 1 :(得分:1)

找到了错误。而不是

Long.reverseBytes(Double.doubleToLongBits(in.readDouble())

只需阅读如下:

Long.reverseBytes(in.readLong())