JavaScript中浮点常量的高效编码

时间:2019-04-05 10:06:53

标签: javascript math.js

我正在用JavaScript编写信号处理演示。为此,我需要存储相对较大的浮点向量。如果我以幼稚的方式(使用mathjs library)这样做:

var vector = math.matrix([-35.545806884765625, -3.1195175647735596,  ...]);

它工作正常,但是源可以轻松拥有兆字节。

有没有一种方法可以表示浮点数,例如以base64编码,以便对源代码进行压缩?

1 个答案:

答案 0 :(得分:1)

一种选择是使用类型化数组,并以十六进制(每个字节两位)序列化基础字节缓冲区。不像base64那样节省空间,而是简单且没有所有unicode麻烦。

let data = new Float32Array([
    -35.545806884765625,
    -3.1195175647735596
    ]

);

console.log(data)

// encode

let encoded = '';

for (let x of new Uint8Array(data.buffer))
    encoded  += (x | 0x100).toString(16).slice(1);

console.log(encoded)

// decode

let bytes = new Uint8Array(
    encoded
        .match(/../g)
        .map(x => parseInt(x, 16)));

let decodedData = new Float32Array(bytes.buffer)

console.log(decodedData);

如果您仍然希望使用base64,则MDN提供了一些有关如何以正确方式进行操作的建议:https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding