16进制浮点数(正和负数)转化成十进制显示,绝对成功显示

在工作需要时,需要此功能,网上查了半天,基本都是正数浮点数可以的,但负数浮点数就报错了,通过查询资料和修改部分函数,完成完全转化功能,经测试OK

用java语言编写了一个三个函数来实现此功能。

转化思路:16进制的字符串>>>转化二进制的字符串>>>由二进制转化成带符号的浮点数(32位和64位都可通用).,分享给需要的朋友!

	/**
	 * 16进制字符串转化二进制字符中
	 * 
	 * @param hexString
	 * @return
	 */
	public static String HexString2binaryString(String hexString) {
		if (hexString == null || hexString.length() % 2 != 0)
			return null;
		String bString = "", tmp;
		for (int i = 0; i < hexString.length(); i++) {
			tmp = "0000" + Integer.toBinaryString(Integer.parseInt(hexString.substring(i, i + 1), 16));
			bString += tmp.substring(tmp.length() - 4);
		}
		return bString;
	}

	/**
	 * 这里只处理规格化数,非规格化数,NaN,finite等没有考虑
	 * 2进制字符串转Float数,包括(正数和负数)
	 * @param binaryString
	 * @return
	 */
	static float BinaryStringToFloat(final String binaryString) {
		// float是32位,将这个binaryString左边补0补足32位,如果是Double补足64位。
		final String stringValue = LeftPad(binaryString, '0', 32);
		// 首位是符号部分,占1位。
		// 如果符号位是0则代表正数,1代表负数
		final int sign = stringValue.charAt(0) == '0' ? 1 : -1;
		// 第2到9位是指数部分,float占8位,double占11位。
		final String exponentStr = stringValue.substring(1, 9);
		// 将这个二进制字符串转成整数,由于指数部分加了偏移量(float偏移量是127,double是1023)
		// 所以实际值要减去127
		final int exponent = Integer.parseInt(exponentStr, 2) - 127;
		// 最后的23位是尾数部分,由于规格化数,小数点左边隐含一个1,现在加上
		final String mantissaStr = "1".concat(stringValue.substring(9, 32));
		// 这里用double,尽量保持精度,最好用BigDecimal,这里只是方便计算所以用double
		double mantissa = 0.0;

		for (int i = 0; i < mantissaStr.length(); i++) {
			final int intValue = Character.getNumericValue(mantissaStr.charAt(i));
			// 计算小数部分,具体请查阅二进制小数转10进制数相关资料
			mantissa += (intValue * Math.pow(2, -i));
		}
		// 根据IEEE 754 标准计算:符号位 * 2的指数次方 * 尾数部分
		return (float) (sign * Math.pow(2, exponent) * mantissa);
	}

	 * @param str
	 * @param padChar
	 * @param length
	 * @return
	 */
	static String LeftPad(final String str, final char padChar, int length) {
		final int repeat = length - str.length();

		if (repeat <= 0) {
			return str;
		}

		final char[] buf = new char[repeat];
		for (int i = 0; i < buf.length; i++) {
			buf[i] = padChar;
		}
		return new String(buf).concat(str);
	}

 

正数和负数可测试成功!请放心使用(调用的方法)

String sBinaryString = HexString2binaryString("BF9DF3B6");

				System.out.println("BF9DF3B6>" + sBinaryString);


				Float ff = BinaryStringToFloat(sBinaryString);


				System.out.println("BF9DF3B6>" + ff.toString(ff));


				System.out.println("BF9DF3B6>" + ff.toString());
				
				
				
				String sBinaryString2 = HexString2binaryString("3F9DF3B6");


				System.out.println("3F9DF3B6>" + sBinaryString2);


				Float ff2 = BinaryStringToFloat(sBinaryString2);


				System.out.println("3F9DF3B6>" + ff2.toString(ff2));


				System.out.println("3F9DF3B6>" + ff2.toString());
执行显示的结果
05-04 15:22:35.370: I/System.out(13329): 3f9d70a4
05-04 15:22:35.370: I/System.out(13329): 1.2299999
05-04 15:22:35.370: I/System.out(13329): K1311P99
05-04 15:22:35.370: I/System.out(13329): BF9DF3B6>10111111100111011111001110110110
05-04 15:22:35.370: I/System.out(13329): BF9DF3B6>-1.234
05-04 15:22:35.370: I/System.out(13329): BF9DF3B6>-1.234
05-04 15:22:35.370: I/System.out(13329): 3F9DF3B6>00111111100111011111001110110110
05-04 15:22:35.370: I/System.out(13329): 3F9DF3B6>1.234
05-04 15:22:35.370: I/System.out(13329): 3F9DF3B6>1.234

你可能感兴趣的:(Java,函数,二进制,32位,java,andriod)