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



我有一个代表GPS坐标的浮点值,我喜欢将其转换为32位十六进制字符串。

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

例如,大多数"ToHex"函数:

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

还我2d.56d0b30b5aa8

但我期待结果42355b43,因为大多数转换器都会返回

你知道我如何在 JavaScript 中得到42355b43吗?

谢谢!

您可以使用ArrayBufferDataView获取TypedArray对象。

然后将值设置为 float 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);

我最终决定编写自己的函数。我把它贴在这里,这样它可以帮助人们:

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);
}

最新更新