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

Posted yqj234

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

以上是关于16进制浮点数(正和负数)转化成十进制显示,绝对成功显示的主要内容,如果未能解决你的问题,请参考以下文章

怎么将4字节16进制转化成浮点数

c语言中如何将10进制的浮点数转化为16进制数

急求十六进制转浮点数C程序!!!

某十六进制浮点数A3680000,将其表示成补码 ,字长32位,阶码8位(含1位阶符),尾数24位(含1 位数符),求该浮点数十进制的真值

MATLAB里将十进制负小数转换成十六进制数

excel表格如何将十六进制转换成浮点数