天天看點

Java中如何将以byte數組給出的資料轉換為double數組形式1 緻謝2 問題描述3 算法設計4 代碼實作5 後記

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語言中 數組的構造方式使用的就是“小端方式” ∴我将我的實作方法表達出來了