Обратное преобразование Кода Левенштейна на 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);
};

→ Ссылка