Обратное преобразование Кода Левенштейна на JavaScript
Есть такой вот Код Левенштейна.
Преобразовать число в код левенштейна очень легко:
const encode=n=>n.toString(2).replace(1,_=>1+encode(~~Math.log2([]+n)));
console.log(encode(15489789578947598754958n));
// => "1111100100010011010001111011010000000011010100011010000101011111001001000010010010001110"
Есть поток байтов, состоящий из кодов Левинштейна разной длины. Что-то вроде:
let response = await fetch(fileURL);
let reader = response.body.getReader();
let {value: chunk, done: readerDone} = await reader.read();
Нужно из этого потока байтов декодировать коды обратно обратно в числа.
Вроде функция декодирования должна быть простая, как и для кодирования. И скорее всего, как высплюсь, разберусь и сам. Вся проблема в том, что числа не разделены между собой ничем и их граница проходит между байтами. А этот ArrayBuffer мне весь мозг сломал.
Ответы (1 шт):
Автор решения: DiD
→ Ссылка
const encode=n=>n.toString(2).replace(1,_=>1+encode(~~Math.log2([]+n)));
const decode = function* (str) {
while(str.length){
let o = 0;
while (str.substr(o,1)=='1') o++;
let n = 1, _o = o + 1;
if(o == 0) n=0;
else for(let i=1;i<o;i++)[n,_o]=[parseInt('1'+str.substring(_o,_o+n),2),_o+n];
yield n;
str = str.substr(_o);
}
}
// Использование
let array = [0, 1001, 0, 2002, 0];
console.log(array);
let str = array.map(encode).join``;
console.log(str);
for(let num of decode(str)){
console.log(num);
};