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); } }
java modbus 32位浮点数解析
猜你喜欢
转载自awen7916.iteye.com/blog/2392486
今日推荐
周排行