avatar

JS浮点数16进制与10进制之间的转换

JS浮点数16进制与10进制之间的转换

天猫精灵IoT平台自定义脚本时,需要将浮点数在16进制与10进制之间进行转换.设备端发过来的浮点数是16进制的,而显示到网页上的浮点数是10进制的.

使用ArrayBuffer DataView TypeArray进行转换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
var aa = 123.45;

// 打印16进制buffer
var floatArr1 = new Float32Array([aa]);
var buffer1 = floatArr1.buffer;
var intArr1 = new Int8Array(buffer1);
intArr1.forEach(function(val){
console.log((val & 0xFF).toString(16).toUpperCase());
});

// buffer转10进制
var intArr2 = new Int8Array([0x42, 0xF6, 0xE6, 0x66]);
var buffer2 = intArr2.buffer;
var dv2 = new DataView(buffer2);
var bb = dv2.getFloat32();

// 打印16进制buffer
var buffer3 = new ArrayBuffer(4);
var dv3 = new DataView(buffer3);
dv3.setFloat32(0, aa, false);
// dv3.setFloat32(0, aa, true);
var intArr1 = new Int8Array(buffer3);
intArr1.forEach(function(val){
console.log((val & 0xFF).toString(16).toUpperCase());
});

以下是网上搜到的写法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
//需要用到的函数
function InsertString(t, c, n) {
var r = [];
for (var i = 0; i * 2 < t.length; i++) {
r.push(t.substr(i * 2, n));
}
return r.join(c);
}
//需要用到的函数
function FillString(t, c, n, b) {
if ((t === "") || (c.length != 1) || (n <= t.length)) {
return t;
}
var l = t.length;
for (var i = 0; i < n - l; i++) {
if (b === true) {
t = c + t;
} else {
t += c;
}
}
return t;
}
//16进制转浮点数
function HexToSingle(t) {
t = t.replace(/\s+/g, "");
if (t === "") {
return "";
}
if (t == "00000000") {
return "0";
}
if ((t.length > 8) || (isNaN(parseInt(t, 16)))) {
return "Error";
}
if (t.length < 8) {
t = FillString(t, "0", 8, true);
}
t = parseInt(t, 16).toString(2);
t = FillString(t, "0", 32, true);
var s = t.substring(0, 1);
var e = t.substring(1, 9);
var m = t.substring(9);
e = parseInt(e, 2) - 127;
m = "1" + m;
if (e >= 0) {
m = m.substr(0, e + 1) + "." + m.substring(e + 1);
}
else {
m = "0." + FillString(m, "0", m.length - e - 1, true);
}
if (m.indexOf(".") == -1) {
m = m + ".0";
}
var a = m.split(".");
var mi = parseInt(a[0], 2);
var mf = 0;
for (var i = 0; i < a[1].length; i++) {
mf += parseFloat(a[1].charAt(i)) * Math.pow(2, -(i + 1));
}
m = parseInt(mi) + parseFloat(mf);
if (s == 1) {
m = 0 - m;
}
return m;
}
//浮点数转16进制
function SingleToHex(t) {
if (t === "") {
return "";
}
t = parseFloat(t);
if (isNaN(t) === true) {
return "Error";
}
if (t === 0) {
return "00000000";
}
var s,
e,
m;
if (t > 0) {
s = 0;
}
else {
s = 1;
t = 0 - t;
}
m = t.toString(2);
if (m >= 1) {
if (m.indexOf(".") == -1) {
m = m + ".0";
}
e = m.indexOf(".") - 1;
}
else {
e = 1 - m.indexOf("1");
}
if (e >= 0) {
m = m.replace(".", "");
}
else {
m = m.substring(m.indexOf("1"));
}
if (m.length > 24) {
m = m.substr(0, 24);
}
else {
m = FillString(m, "0", 24, false);
}
m = m.substring(1);
e = (e + 127).toString(2);
e = FillString(e, "0", 8, true);
var r = parseInt(s + e + m, 2).toString(16);
r = FillString(r, "0", 8, true);
return InsertString(r, " ", 2).toUpperCase();
}
文章作者: pengweifu
文章链接: https://www.pengwf.com/2019/11/06/web/JS-Hex/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 麦子的博客
打赏
  • 微信
    微信
  • 支付宝
    支付宝

评论