设备端(C写的程序)上传消息服务器(java写的)直接存入文件,下载文件进行解码,其中转换int、String类型正常,转换float数据异常。
public class demo {
private static String device_log = "THlSYX4BAADRAQIAJQZRPwAAAEAlBlE/1nxoP0BX1j4t/n+/sIT0u1xlcj8fr6S+v1UDv0u+Wz8fyuY+XoRkP4ClXD/YzwG/WY05P75eMD8EQMC9nN5+vxpef7+Q3Y+9hYU+v2n9Kr9o0nc/FmGAPmv11b5ck2g/JxBAVbZ1TSG6UU3Y2TNNzzi2TGnIfUwTwYpMCwaWTCgl0EwkIRBOsBKJT5V7KFB5uE9PBfh8TdZWrk0XFh1PDpyIUG7oWFGMF4BRu2rNUKfxSU91cRZOgqgYTrAoS04js4tOs6xLTsX56k0OPjFOfOaATtLQDE547L9NQft/Tc8xIk50nkJPwmFcT74uNVAUIAxQrSaXTRXUQ09w2LJPI5hbT2hDr03pTXBNjwk8TlGKIE+eek9P8OFDT+OzKk6GuCFO4TBET7LtaU8P+Y5PWOQiT/JeiU1t3+VMQu4VTevEHU1pIbBNLFwnTejX3UxsBGhOOkMcT6iV1k4wygNO+RNdTZPItQ==";
public static void main(String[] args) {
byte[] bytes = null; //字节流
try {
bytes = EncodeUtil.decryptBASE64(device_log);
} catch (Exception e) {
e.printStackTrace();
}
byte[] arr = new byte[4];
System.arraycopy(bytes, 0, arr, 0, 4);
System.out.println("LyRa--------------------" + new String(arr, Charset.forName("GBK"))); //LyRa
System.arraycopy(bytes, 0 + 4, arr, 0, 4);
int count1 = ByteUtil.getIntLowEndian(arr);
System.out.println("长度:-----------------------" + count1); //长度
System.out.println("标识符:--------------------" + "0x" + Integer.toHexString(bytes[8] & 0xFF)); //0xd1
System.out.println("id:--------------------0x0"+ Integer.toHexString(bytes[ 9] & 0xFF)); //0x00---id
byte[] arr2 = new byte[2];
System.arraycopy(bytes, 10, arr2, 0, 2);
System.out.println("valid_mask有效掩码-------------------------" + ByteUtil.getTiny(arr2));
int count = 4;
byte[] tmpByte = new byte[count];
System.arraycopy(bytes, 16, tmpByte, 0, count);
System.out.print(ByteUtil.getLowFloat(tmpByte));
System.out.println("----"+bytes.length+"----");
//字节序号1-4:Lyra
//字节序号5-8:126 1 0 0
//字节序号9:---转int----1----------转16进制---0x01
//字节序号10-11:---转int---2.0
//字节序号12-15:---转Float---0.8165 ---反角X
//字节序号16-19:---转float---2.0 ---反角Y
//字节序号20-23:---转float---0.8165 ---反角Z
//字节序号24-27:---转float---0.90815485 ---I路补偿值
//字节序号28-31:---转float---0.4186344 ---Q路补偿值
//字节序号32-35: ---转float---(-0.99997216)
//字节序号36-39:---转float--- (-0.0074621066)
//字节序号40-43:---转float--- 0.9468591
//字节序号44-47:---转float--- (-0.32164857)
//字节序号48-51:---转float--- (-0.51302713)
//字节序号52-55:---转float--- 0.8583724
//字节序号56-59:---转float--- 0.4507608
//字节序号60-63:---转float--- 0.89264476
//字节序号64-67:---转float--- 0.8619003
//字节序号68-71:---转float--- (-0.5070777)
//字节序号72-75:---转float--- 0.72481304
//字节序号76-79:---转float--- 0.68894565
//字节序号80-83:---转float--- (-0.0938721)
//字节序号84-87:---转float--- (-0.99558425)
//字节序号88-91:---转float--- (-0.9975296)
//字节序号92-95:---转float--- (-0.070246816)
//字节序号96-99:---转float--- (-0.74422485)
//字节序号100-103:---转float---(-0.66792923)
//字节序号104-107:---转float--- 0.9680543
//字节序号108-111:---转float--- 0.2507407
//字节序号112-115:---转float---(-0.41788802)
//字节序号116-119:---转float---(0.9084985)
//字符序号120:---转int---39---转16进制---0x27
//字符序号121:---转int---16---转16进制---0x10
//字符序号122:---转int---64---转16进制---0x40
//字节序号4*Nr+199: 382-199=183
//123-126
for (int i = 123; i <=370 ; i+=4) {
System.arraycopy(bytes, i, tmpByte, 0, count);
System.out.print(byte2float(tmpByte,0)+" ");
}
}
/**
* 将byte转换成float
*/
public static float byte2float(byte[] b, int index) {
int l;
l = b[index + 0];
l &= 0xff;
l |= ((long) b[index + 1] << 8);
l &= 0xffff;
l |= ((long) b[index + 2] << 16);
l &= 0xffffff;
l |= ((long) b[index + 3] << 24);
return Float.intBitsToFloat(l);
}
}
LyRa--------------------LyRa
长度:-----------------------382
标识符:--------------------0xd1
id:--------------------0x01
valid_mask有效掩码-------------------------2
2.0----382----
2.57647952E8 2.19914768E8 1.88587392E8 9.553676E7 6.6527652E7 7.274716E7 7.8655576E7 1.09128E8 6.0452275E8 4.5994066E9 1.13066854E10 3.48497331E9 2.6525704E8 3.65615808E8 2.63547059E9 1.83354286E10 5.8225779E10 6.8768858E10 2.75705917E10 3.38805734E9 6.3100448E8 6.4029504E8 8.5211034E8 1.17188646E9 8.5427322E8 4.9277968E8 7.4340851E8 1.08129434E9 5.9062387E8 4.02493184E8 2.68416016E8 6.8029331E8 3.26516429E9 3.69739418E9 1.21589576E10 9.40365E9 3.16986784E8 3.28545613E9 6.0010578E9 3.68418074E9 3.67553792E8 2.5197736E8 7.8868576E8 2.69341926E9 3.48091955E9 3.28636416E9 7.1597894E8 6.7830618E8 3.29153766E9 3.92466893E9 4.797374E9 2.73287373E9 2.88087616E8 1.20519528E8 1.57213728E8 1.65433008E8 3.69372448E8 1.75489728E8 1.16309824E8 9.7315098E8 2.62165146E9 1.80006605E9
base[4]转换float结果正常
可以写一个直接的,就是输入的字符串是什么,输出的期望float是什么
1)告诉我你的输入字节和期望输出
给你一个字节数组转换float方法试一下。
public static float[] ByteArrayToFloatArray(byte[] data)
{
float[] result = new float[data.length / 4];
int temp = 0;
for (int i = 0; i < data.length; i += 4)
{
temp = temp | (data[i] & 0xff) << 0;
temp = temp | (data[i+1] & 0xff) << 8;
temp = temp | (data[i+2] & 0xff) << 16;
temp = temp | (data[i+3] & 0xff) << 24;
result[i / 4] = Float.intBitsToFloat(temp);
}
return result;
}
你说的异常是指的输出结果有Ex?这是科学计数法输出的结果,不是异常
将byte2float方法改成如下代码试试
public static float byte2float(byte[] bytes,int index) {
float value = index;
// 由高位到低位
for (int i = 0; i < 4; i++) {
int shift = (4 - 1 - i) * 8;
value += (bytes[i] & 0x000000FF) << shift;// 往高位游
}
return value;
}