java中,IEEE754標準(四字節)的字節數據和浮點數之間的轉化(Float and byte[])

java不像c語言那樣。c語言在浮點數和字節數組進行轉化時,是非常容易的。而java則比較複雜。下面是自己編寫的IEEE754的字節數組和float數據之間的轉化方法。供大家借鑑下。經過自己的不少測試,感覺應該是正確的。不過也有可能還會存在某些冗餘或者bug的地方,歡迎大家批評指正。

public class FloatAndByte {

	/**
	 * @param args
	 *            對於IEEE754編碼。由float轉換爲IEEE754編碼
	 * @author Administrator
	 * @version1.0
	 */
	// public static void main(String[] args) {
	// // TODO Auto-generated method stub
	//
	// byte[] data;
	// System.out.println((float) 21.75);
	// data=floatToByte((float) 20.5);
	// for(int i=0;i<4;i++){
	// System.out.println(Integer.toHexString(data[i]&0xff));
	// }
	// }

	public static float bytesToFloat(byte[] data) {// 解析4個字節中的數據,按照IEEE754的標準
		int s = 0;// 浮點數的符號
		float f = 0;// 浮點數
		int e = 0;// 指數
		if ((data[3] & 0xff) >= 128) {// 求s
			s = -1;
		} else {
			s = 1;
		}
		int temp = 0;// 指數位的最後一位
		if ((data[2] & 0xff) >= 128) {
			temp = 1;
		} else
			temp = 0;
		e = ((data[3] & 0xff) % 128) * 2 + temp;// 求e
		// f=((data[2]&0xff)-temp*128+128)/128+(data[1]&0xff)/(128*256)+(data[0]&0xff)/(128*256*256);
		float[] data2 = new float[3];
		data2[0] = data[0] & 0xff;
		data2[1] = data[1] & 0xff;
		data2[2] = data[2] & 0xff;
		f = (data2[2] - temp * 128 + 128) / 128 + data2[1] / (128 * 256)
				+ data2[0] / (128 * 256 * 256);
		float result = 0;
		if (e == 0 && f != 0) {// 次正規數
			result = (float) (s * (f - 1) * Math.pow(2, -126));
			return result;
		}
		if (e == 0 && f == 0) {// 有符號的0
			result = (float) 0.0;
			return result;
		}
		if (s == 0 && e == 255 && f == 0) {// 正無窮大
			result = (float) 1111.11;
			return result;
		}
		if (s == 1 && e == 255 && f == 0) {// 負無窮大
			result = (float) -1111.11;
			return result;
		} else {
			result = (float) (s * f * Math.pow(2, e - 127));
			return result;
		}

	}

	public static byte[] floatToBytes(float a) {
		byte[] data = new byte[4];
		if(a==0){
			for(int i=0;i<4;i++){
				data[i]=0x00;
			}
			return data;
		}
		Integer[] intdata = { 0, 0, 0, 0 };
		a = Math.abs(a);
		// 首先將浮點數轉化爲二進制浮點數
		float floatpart = a % 1;
		int intpart = (int) (a / 1);

		System.out.println(intpart + " " + floatpart);
		// 將整數部分化爲2進制,並轉化爲string類型
		String intString = "";
		String floatString = "";
		String result = "";
		String subResult = "";
		int zhishu = 0;
		if (intpart == 0) {
			intString += "0";
		}
		while (intpart != 0) {
			intString = intpart % 2 + intString;
			intpart = intpart / 2;
		}
		while (floatpart != 0) {
			floatpart *= 2;
			if (floatpart >= 1) {
				floatString += "1";
				floatpart -= 1;
			} else {
				floatString += "0";
			}

		}

		result = intString + floatString;
		System.out.println(intString + "." + floatString);
		intpart = (int) (a / 1);
		if (intpart > 0) {// 整數部分肯定有1,且以1開頭..這樣的話,小數點左移
			zhishu = intString.length() - 1;
		} else {// 整數位爲0,右移
			for (int i = 0; i < floatString.length(); i++) {
				zhishu--;
				if (floatString.charAt(i) == '1') {
					break;
				}
			}
			// while(floatString.charAt(index)){}
		}
		// 對指數進行移碼操作

		System.out.println("result==" + result + " zhishu==" + zhishu);
		if (zhishu >= 0) {
			subResult = result.substring(intString.length() - zhishu);
		} else {
			subResult = floatString.substring(-zhishu);
		}
		System.out.println("subResult==" + subResult);
		zhishu += 127;
		if (subResult.length() <= 7) {// 若長度

			for (int i = 0; i < 7; i++) {
				if (i < subResult.length()) {
					intdata[1] = intdata[1] * 2 + subResult.charAt(i) - '0';
				} else {
					intdata[1] *= 2;
				}

			}

			if (zhishu % 2 == 1) {// 如果質數是奇數,則需要在這個最前面加上一個‘1’
				intdata[1] += 128;
			}
			data[1] = intdata[1].byteValue();
		} else if (subResult.length() <= 15) {// 長度在(7,15)以內
			int i = 0;
			for (i = 0; i < 7; i++) {// 計算0-7位,最後加上第一位
				intdata[1] = intdata[1] * 2 + subResult.charAt(i) - '0';
			}
			if (zhishu % 2 == 1) {// 如果質數是奇數,則需要在這個最前面加上一個‘1’
				intdata[1] += 128;
			}
			data[1] = intdata[1].byteValue();

			for (i = 7; i < 15; i++) {// 計算8-15位
				if (i < subResult.length()) {
					intdata[2] = intdata[2] * 2 + subResult.charAt(i) - '0';
				} else {
					intdata[2] *= 2;
				}

			}
			data[2] = intdata[2].byteValue();
		} else {// 長度大於15
			int i = 0;
			for (i = 0; i < 7; i++) {// 計算0-7位,最後加上第一位
				intdata[1] = intdata[1] * 2 + subResult.charAt(i) - '0';
			}
			if (zhishu % 2 == 1) {// 如果質數是奇數,則需要在這個最前面加上一個‘1’
				intdata[1] += 128;
			}
			data[1] = intdata[1].byteValue();

			for (i = 7; i < 15; i++) {// 計算8-15位
				intdata[2] = intdata[2] * 2 + subResult.charAt(i) - '0';
			}
			data[2] = intdata[2].byteValue();

			for (i = 15; i < 23; i++) {// 計算8-15位
				if (i < subResult.length()) {
					intdata[3] = intdata[3] * 2 + subResult.charAt(i) - '0';
				} else {
					intdata[3] *= 2;
				}

			}
			data[3] = intdata[3].byteValue();
		}

		intdata[0] = zhishu / 2;
		if (a < 0) {
			intdata[0] += 128;
		}
		data[0] = intdata[0].byteValue();
		byte[] data2 = new byte[4];// 將數據轉移,目的是倒換順序
		for (int i = 0; i < 4; i++) {
			data2[i] = data[3 - i];
		}
		return data2;
	}
}


在使用時,直接調用便可以。

發佈了18 篇原創文章 · 獲贊 6 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章