Эффективное кодирование для констант с плавающей точкой в ​​JavaScript - PullRequest
1 голос
/ 05 апреля 2019

Я пишу демонстрацию обработки сигналов в JavaScript.Для этого мне нужно хранить относительно большие векторы поплавков.Если я делаю это наивным способом (используя библиотеку mathjs ):

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

, это работает нормально, но источник может легко иметь мегабайты.

Есть лиспособ, как представить число с плавающей точкой, например, в кодировке base64, чтобы исходный код был сжат?

1 Ответ

1 голос
/ 05 апреля 2019

Один из вариантов - использовать типизированные массивы и сериализовать базовые байтовые буферы в шестнадцатеричном формате (две цифры на байт).Не такой компактный, как base64, но простой и без всяких проблем с юникодом.

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

...