我有一個二進制文件,我逐字節讀取。將8字節的小端二進制轉換爲雙精度浮點型
我遇到了一個8字節長的部分,持有一個雙精度浮點數(小端)。我無法弄清楚如何讀取這些信息並通過掩蔽和/或轉換來正確計算。
(具體來說,文件類型是.LAS,但這應該不重要)。
是否有任何Java技巧?
我有一個二進制文件,我逐字節讀取。將8字節的小端二進制轉換爲雙精度浮點型
我遇到了一個8字節長的部分,持有一個雙精度浮點數(小端)。我無法弄清楚如何讀取這些信息並通過掩蔽和/或轉換來正確計算。
(具體來說,文件類型是.LAS,但這應該不重要)。
是否有任何Java技巧?
您可以使用ByteBuffer
從byte[] bytes
double d = ByteBuffer.wrap(bytes).order(ByteOrder.LITTLE_ENDIAN).getDouble();
從插座
ByteBuffer bb = ByteBuffer.allocate(64*1024).order(ByteOrder.LITTLE_ENDIAN);
socket.read(bb);
bb.flip();
double d = bb.getDouble();
這裏描述了兩種不同的方法:http://bytes.com/topic/java/answers/18253-big-endian-vs-little-endian-data。兩者都可以工作。
只需使用DataInputStream
來讀取文件,並使用readDouble()
方法。
DataInputStream類始終是「網絡定購」,這是大端。 –
「應用程序使用數據輸出流來寫入稍後可以通過數據輸入流讀取的數據」。我不認爲在這種情況下 – peter
如果您需要讀取和交換字節順序,有來自下議院IO EndianUtils:
http://commons.apache.org/io/api-release/org/apache/commons/io/EndianUtils.html
鏈接已損壞(*「未找到,請求的URL /proper/commons-io/api-release/org/apache/commons/io/EndianUtils.html在此服務器上未找到。」*)。 –
ByteBufferInputStream
包裝你的轉換字節。DataInputStream.readDouble(in)
獲取您的雙精度數字。或者,你可以採取從JDK源readDouble
方法的主體並跳過步驟2和3。
非常可靠的貢獻,正是我所需要的。謝謝(和其他所有回答如此之快的人)!週末愉快。 – RedLeader
直接緩衝區在這裏會更好(第二個樣本),只要緩衝區不經常分配和重用。在這種情況下,我傾向於使用套接字readBuffer作爲大小。 – bestsss
@bestsss,同意如果管理正確,直接的ByteBuffer會更好。我發現直接緩衝區的速度可以高達20%。如果您將它與Unsafe類一起使用,它可以再快30%。 ;) –