1. 程式人生 > >java modbus 32位浮點數解析

java modbus 32位浮點數解析

/**
* modbus 返回的四位元組的浮點數轉換<br>
* hexstr = "AE 14 41 43";原始串
*/
public static Double getDoubleByHexstr(String hexstr) {
String[] hexarray = hexstr.split( " " );
// 高地位互換
hexstr = hexarray[ 2 ] + hexarray[ 3 ] + hexarray[ 0 ] + hexarray[ 1 ];
// System.out.println( hexstr );
// 先將16進位制數轉成二進位制數0 10000001 00000000000000000000000 <br>
String binarystr = hexString2binaryString( hexstr );
// 1位符號位(SIGN)=0 表示正數
String sign = binarystr.substring( 0, 1 );
// 8位指數位(EXPONENT)=10000001=129[10進位制]
String exponent = binarystr.substring( 1, 9 );
int expint = Integer.parseInt( exponent, 2 );
// 23位尾數位(MANTISSA)=00000000000000000000000
String last = binarystr.substring( 9 );
// 小數點移動位數
int mobit = expint - 127;
// 小數點右移18位後得10101001 01101001 110.00000
StringBuffer sb = new StringBuffer();
for (int i = 0; i < 23; i++) {
if (i == mobit)
sb.append( "." );
char b = last.charAt( i );
sb.append( b );


}
String valstr = "1" + sb.toString();
int s = valstr.indexOf( "." ) - 1;// 指數
Double dval = 0d;
for (int i = 0; i < valstr.length(); i++) {
if (valstr.charAt( i ) == '.')
continue;


Double d = Math.pow( 2, s );
int f = Integer.valueOf( valstr.charAt( i ) + "" );
// System.out.println( f );
d = d * f;
// System.out.println( "c:=" + valstr.charAt( i ) + ",s=" + s +
// ",val=" + d + ", Math.pow( 2, s )=" + Math.pow( 2, s ) );
s = s - 1;
dval = dval + d;
}
if (sign.equals( "1" ))
dval = 0 - dval;
return round( dval, 4 );

}

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;
}