js实现十六进制转换单&双精度浮点数
一、JS处理32位整型位运算?
示例:在JS中无论是整数还是小数都是按照64位的浮点数形式存储,而整数运算会自动转化为32位有符号整数。
有符号整数使用 31 位表示整数的数值,用第 32 位表示整数的符号,0 表示正数,1 表示负数。数值范围为 [-2^31 , 2^31-1], 即[ -2147483648 , 2147483647 ]。
JavaScript 进行位操作时,采用32位有符号整型,这意味着其转换的结果也是32位有符号整型。 有时我们进行移位会由于符号的存在产生与c语言无符号整数不一样的结果。
针对该问题,我们可以把JavaScript 中的有符号数,转换成无符号数。只需要进行 >>>0 移位操作就好了。
二、js 16进制转浮点数
1. 4字节16进制转单精度浮点数
代码如下(示例):
function hexToSingle(num){
var a = num;
var b = parseInt(a,16);
var s = (b&0x80000000) ? -1 : 1;
var e = (b&0x7f800000)/0x800000-127;
var c = (b&0x7fffff)/0x800000;
var re = s*(1+c)*Math.pow(2,e);
return re;
}
例如
const str = '42a0774c'
hexToSingle(str) = 80.23300170898438(js浮点数可能有误差)
2. 8字节16进制转双精度浮点数
代码如下(示例):
function HexToDouble(ca2){
var t = parseInt(ca2,16).toString(2);
if (t.length < 64) {
t = FillString(t, "0", 64, true);
};
var s = t.substring(0, 1);
var e = t.substring(1, 12);
var m = t.substring(12);
e = parseInt(e, 2) - 1023;
m = "1" + m;
if (e >= 0) {
m = m.substring(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;
}
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;
}
例如
var str = "40dd7ac4b41562f9";
HexToDouble(x) = 30187.073491428047 (js浮点数可能有误差)
贴上参考的文章
https://blog.youkuaiyun.com/u014322206/article/details/84745987;
https://bbs.youkuaiyun.com/topics/391956637;
https://www.cnblogs.com/ampedZ/p/HexToSingle.html;