簡體   English   中英

Java從二進制結構化文件中讀取錯誤的值

[英]Java reads wrong values from binary structured file

我有一個包含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的任何double轉換為BE,反之亦然?

我懷疑問題可能是因為當它們不是 big-endian double時,您正在讀取8個字節作為big-endian double。 假定位具有double特定含義,這可能會引起問題-例如,Java可能正在規范化NaN值。 有點像使用已知不正確的編碼讀取文本數據,然后將其轉換回字節...

如果您從一開始就讀了long的值,那么應該保留所有位,因此您可以反轉字節, 然后轉換為double

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

已發現錯誤。 代替

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

只需閱讀以下內容:

Long.reverseBytes(in.readLong())

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM