1 緻謝
感謝陳玮學長的代碼 由于學習了他的代碼 我才最終得出了正确的結論
2 問題描述
今天程式設計的時候遇到1個問題 需要從一個二進制檔案中讀取double[]的資料 我們使用的程式設計語言是Java語言 經過查閱資料之後發現:Java似乎不能直接通過double[]的指針直接讀取資料 ∴如果我們想通過使用類似C語言的進行指針操作完成資料讀寫應該是行不通的 需要轉換其它思路實作這個目标 首先我們來明确一下可以做到的事情 首先我們把所有的數組資料讀入到了一個byte[]數組中 這件事情是可以做到的 代碼如下:
File sourceFile = new File(source);
FileInputStream stream = new FileInputStream(source);
DataInputStream dis = new DataInputStream(stream);
for (int i = 0; i < bufferSize; i++) {
dis.read(buffer, 0, doubleSize);
}
使用DataInputStream的read()方法就可以實作 然後需要我們自己實作一個byte[]轉換為double的轉換函數 再利用循環一個個放入double[]數組中就可以了 然後經過查閱資料 又獲得1個有效資訊 就是long類型可以使用函數Double.longBitsToDouble()直接轉換為double 是以最終剩下的問題就是如何将byte[]轉換為double 總結一下轉換函數的需求描述: 輸入 —— 長度為8的byte[] 輸出 —— 1個long資料
3 算法設計
使用位運算實作 一共有8個byte資料 分别是8個位元組資料構成1個long資料 對于每個byte資料 1.使用“<<”運算将位元組移動到相應的位置 2.用“& 0xFF”進行“位清理” (注意位清理的時候 0xFF同樣需要進行相應的移位操作 具體的實作可以參考我的“代碼實作”) 3.用“|”操作進行合并 4.重複上述過程
4 代碼實作
/**
* 将一個8位位元組數組轉換為雙精度浮點數。<br>
* 注意,函數中不會對位元組數組長度進行判斷,請自行保證傳入參數的正确性。
*
* @param b
* 位元組數組
* @return 雙精度浮點數
*/
public static double bytesToDouble(byte[] b) {
return Double.longBitsToDouble(bytesToLong(b));
}
/**
* 将一個8位位元組數組轉換為長整數。<br>
* 注意,函數中不會對位元組數組長度進行判斷,請自行保證傳入參數的正确性。
*
* @param b
* 位元組數組
* @return 長整數
*/
public static long bytesToLong(byte[] b) {
int doubleSize = 8;
long l = 0;
for (int i = 0; i < doubleSize; i++) {
// 如果不強制轉換為long,那麼預設會當作int,導緻最高32位丢失
l |= ((long) b[i] << (8 * i)) & (0xFFL << (8 * i));
}
return l;
}
以上是代碼實作 大家可以看看
5 後記
其實百度一下 網上還是有很多byte[]數組轉double的方法 但是我還是把自己的方法記錄了下來 因為已經養成了記錄的習慣 而且我的方法和網上的方法還是有一些不同 第一 我是用循環的方法實作的 代碼具有更高的可讀性 第二 大家課可以看看我的代碼實作 是“資料低位元組儲存在記憶體的高位址中” ∴使用的是小端方式 而網上的方法大多講的是“大端方式” 但我覺得這是不夠的 因為在C語言中 數組的構造方式使用的就是“小端方式” ∴我将我的實作方法表達出來了