将16进制的数值转换为各种需要的float、int类型
方法很简单:
public static Float str16ToFloat(String str){//字符串转float
Float value = Float.intBitsToFloat(Integer.valueOf(str.trim(), 16));//trim()方法:删除字符串头尾的空白符
return value;
}
这里重点看一下intBitsToFloat(int bits):返回对应于给定位表示形式的 float 值。根据 IEEE 754 浮点“单一格式”位布局,该参数被视为浮点值表示形式。
而我们的数值接收的时候,大多数都只是一串字符串,因此需要用.valueOf()方法进行转换,此方法用于返回给定参数的原生 Number 对象值,参数可以是原生数据类型, String等。语法格式如下:
static Integer valueOf(int i)//i -- Integer 对象的整数。
static Integer valueOf(String s)//s -- Integer 对象的字符串。
static Integer valueOf(String s, int radix)//radix --在解析字符串 s 时使用的进制数,用于指定使用的进制数。
然后在主函数中循环调用就行了:
for (int i = 0; i<=287; i = i+8){
char float_num[] = copyOfRange(eventArray,i ,i+8);//a为所有float参数的值(16位模式下)float:占4个字节,即8个16位数
String str_num = String.valueOf(float_num);//s为将a的值转为字符串并送入方法中转为float数值
float num = str16ToFloat(str_num);//转换得到的float结果
char value_0[] = String.valueOf(num).toCharArray();//将float结果转换为字符数组
char value[] = {value_0[0],value_0[1],value_0[2]};//保留两位
String valueFinal = String.valueOf(value);//转成字符串,方便传输
if(i == 0){
allValue[i] = valueFinal;
}else {
allValue[i/8] = valueFinal;//所有字符串值保留到一个数组内方便传输
}
}
可以发现,这个循环不是我们常见的“i++”这种自加类型的for循环,究其原因,是我们规定的数据类型为float,每个float类型的数据占4个字节,原始数据包的数值为16进制的,0.5字节/进制位,因此,每个数据就占8个数据包的值。