/**
* src低位在前
* 将一个字节数组转换为 IEEE 754 单精度浮点数(float)
*
* EEE 754 单精度浮点数概述
* IEEE 754 单精度浮点数由 32 位组成,分为三个部分:
* 符号位 (1 bit):表示数值的正负。
* 指数位 (8 bits):用于存储指数值。
* 尾数/有效数字 (23 bits):用于存储数值的精确部分。
* @param src
* @return
*/
public static float byteArray2IEEE754Float(byte[] src) {
int data = (src[3] << 24) & 0xffffffff;
data = data | ((src[2] << 16) & 0x00ffffff);
data = data | ((src[1] << 8) & 0x0000ffff);
data = data | (src[0] & 0x000000ff);
int nSign;
if ((data & 0x80000000) > 0) {
nSign = -1;
} else {
nSign = 1;
}
int nExp = data & (0x7F800000);
nExp = nExp >> 23;
int nMantissa = data & (0x7FFFFF);
float value = nSign * (1 + (nMantissa * (float) Math.pow(2, -23))) * (float) Math.pow(2, nExp - 127);
return value;
}
3.3.4 INFO
数据格式
3.3.4.1
浮点数格式
浮点数格式与
IEEE-754
标准(
32
)有关,长度
32
位。四个字节的浮点数
据传送顺序为先低字节后高字节,即传送顺序为:先低字节
D7~D0
,接着
D15~D8
,然后
D23~D16
,最后高字节
D31~D24
,最终作为分成
8
个
ASCII
码传
送。浮点数格式如下:


浮点数的正负取决于符号位
S
的值,
S=1
表示浮点数为负,
S=0
则浮点
数为正。例如:当
32
位浮点数为
0x40
,
0xA0
,
0x00
,
0x00
时(如上所示),
即
S=0
,
E=129
,
M=2^21
,
则浮点数值
=
(
1 + 2^21
×
2^-23
)·
2^(129-127) = 5.0
float
类型数据解析
39 41 31 39 35 43 34 33
:交流输入相电压
A(220.1)
,怎么对应出来的
10
进制的
220.1
?
39 41 31 39 35 43 34 33 (8
字节
)
9 A 1 9 5 C 4 3
9A 19 5C 43
(
4
字节)先低字节后高字节,调用下面函数可将这
4
个字节转成浮点数(
10
进制)
private static String DIGITS = "0123456789ABCDEF";
// byteArray = [57, 65, 49, 57, 53, 67, 52, 51];
public static byte[] AsciiArray2HexArray(byte[] byteArray) {
String s = new String(byteArray);
byte[] buff = new byte[s.length() >> 1];
int index = 0;
String temp;
for (int i = 0; i < s.length(); i += 2) {
temp = s.substring(i, i + 2);
buff[index] = (byte) Integer.parseInt(temp, 16);
++index;
}
return buff;
}
// buff = [-102, 25, 92, 67] <—— 9A 19 5C 43

在线浮点数转二进制工具
(网址:
https://tooltt.com/floatconverter/
)