在JavaScript中将浮点数转换为32位十六进制字符串

8

我有一个浮点数值代表GPS坐标,我想把它转换成32位的十六进制字符串。

我尝试了这里描述每一个解决方案,但每次结果都不是我期望的。

例如,大多数“ToHex”函数:

var lat = 45.839152;
console.log(ToHex(lat));

返回给我2d.56d0b30b5aa8

但我期望的结果是42355b43,因为most转换器都会返回这个结果

你知道我怎么在JavaScript中得到42355b43作为结果吗?

谢谢!


首先,JavaScript 数字是 64 位值,而不是 32 位。 - Pointy
好的,但我需要一个32位十六进制值,我可以截断它吗? - Aznhar
我编写了浮点数转十六进制字符串和十六进制字符串转浮点数的转换函数,并且我得到了45.839152的0x42375b4a结果。我使用其他人的函数也得到了相同的结果,例如https://www.h-schmidt.net/FloatConverter/IEEE754.html和https://gregstoll.com/~gregstoll/floattohex/。如果有兴趣,我可以将我的JavaScript函数放在网上,它们不像其他解决方案那样被混淆/缩小,因此您可以看到它是如何工作的。 - user3015682
顺便提一下,您提供的十六进制值转换为45.3391227722168。 - user3015682
有关十进制转浮点数,请参见 https://dev59.com/HnVD5IYBdhLWcg3wL4mM - Avatar
2个回答

12
你可以使用TypedArray对象和ArrayBuffer以及DataView进行操作。
然后将值设置为32位浮点数,以无符号8位整数读取视图中的值。

const getHex = i => ('00' + i.toString(16)).slice(-2);

var view = new DataView(new ArrayBuffer(4)),
    result;

view.setFloat32(0, 45.839152);

result = Array
    .apply(null, { length: 4 })
    .map((_, i) => getHex(view.getUint8(i)))
    .join('');

console.log(result);


0

我最终决定编写自己的函数。我在这里发布它,以便能够帮助人们:

function ToHex(d) {

    var sign = "0";

    if(d<0.0){
        sign = "1";
        d = -d;
    }

    var mantissa = parseFloat(d).toString(2);

    var exponent = 0;

    if(mantissa.substr(0,1) === "0"){
        exponent = mantissa.indexOf('.') - mantissa.indexOf('1') + 127;
    }
    else{
        exponent = mantissa.indexOf('.') - 1 + 127;
    }

    mantissa = mantissa.replace(".", "");
    mantissa = mantissa.substr(mantissa.indexOf('1')+1);

    if(mantissa.length>23){
        mantissa = mantissa.substr(0,23);
    }
    else{
        while(mantissa.length<23){
            mantissa = mantissa +"0";
        }
    }

    var exp = parseFloat(exponent).toString(2);

    while(exp.length<8){
        exp = "0" + exp;
    }

    var numberFull = sign + exp + mantissa;

    return parseInt(numberFull, 2).toString(16);
}

如果你传入“0”,它将返回3f800000而不是零,如果你传入1999,它将返回3ef9e000而不是44f9e000,似乎有些不对劲。 - Anthony Webb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接