我有一个由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是不可能的,反之亦然?
答案 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())