package com;
import java.text.DecimalFormat;
public class test {
public static void main(String[] args) {
// TODO Auto-generated method stub
String str="";
str="60004133";
System.out.println("point_102 蒸汽压力:"+getDoubleByHexstr(str));
/*str="D1, EC, 43, 6C";
System.out.println("point_103 汽包液位:"+getDoubleByHexstr(str));
str="2A, B4, 40, E7";
System.out.println("point_104 蒸汽流量:"+getDoubleByHexstr(str));
str="71, 9A, 41, 18";
System.out.println("point_105 给水流量:"+getDoubleByHexstr(str));
str="98, 00, 44, 2D";
System.out.println("point_106 炉膛温度:"+getDoubleByHexstr(str));
str="00, 00, 43, 01";
System.out.println("point_107 1#给料温度:"+getDoubleByHexstr(str));
str="99, 9A, 43, 33";
System.out.println("point_108 2#给料温度:"+getDoubleByHexstr(str));
str="E6, 66, 43, 14";
System.out.println("point_118 2#给料温度:"+getDoubleByHexstr(str));
str="33, 33, 42, F4";
System.out.println("point_119 一次风温度:"+getDoubleByHexstr(str));
str="00, 00, 42, C8";
System.out.println("point_120 空预器出口温度:"+getDoubleByHexstr(str));
str="00, 00, 00, 00";
System.out.println("point_121 布袋进口温度:"+getDoubleByHexstr(str));
str="00, 00, 00, 00";
System.out.println("point_122 排烟温度:"+getDoubleByHexstr(str));
str="00, 00, 00, 00";
System.out.println("point_123 给水调节阀开度:"+getDoubleByHexstr(str));*/
//System.out.println(getDoubleByHexstr(str));
}
/**
* 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];
hexstr=hexstr.substring(4, 6)+hexstr.substring(6, 8)+hexstr.substring(0, 2)+hexstr.substring(2, 4);
System.out.println(hexstr);
// 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);
}
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;
}
public static Double round(double dt){
DecimalFormat df=new DecimalFormat(".####");
String strdt=df.format(dt);
return Double.parseDouble(strdt);
}
}