Я не понимаю, как работает этот код для «записи Uint32 внутри массива в JavaScript» - PullRequest
0 голосов
/ 14 июня 2019

Так что в основном у меня есть этот кусок кода, который я нашел в чужом коде, и он отлично работает для того, что я пытаюсь сделать, но мне хотелось бы понять, как это работает.

Я хочу знатьчем он отличается от записи uint32 в массив, как использование Uint8Array и запись в буфер Uint32Array или использование DataView с setUint32, не дает того же результата

function writeUint32(message, value){
    while(true){
        if((value & -128) === 0){
            message.push(value)
            return
        }
        else {
            message.push(value & 127 | 128)
            value >>>= 7
        }
    }
}

1 Ответ

1 голос
/ 14 июня 2019

Разница в том, что эта функция записывает значение в формате переменной длины, используя 7 бит данных на байт и 1 бит, чтобы сигнализировать о том, что больше данных следует в порядке младшего байта (первый байт содержит младшие биты).Это известно как LEB128 .setUint32 в DataView просто копирует биты прямо в базовый массив без сложного кодирования.LEB128 (или другое кодирование переменной длины) может использоваться для экономии места (если кодированные значения обычно не высоки), но стоит немного дополнительной работы для кодирования и декодирования.

Чтобы объяснить код,

(value & -128) === 0

Это проверяет, все ли старшие 25 бит равны нулю, если они равны, то текущее значение помещается в 7-битный блок, и это будет последний блок (флаг «продолжить» не установлен).

value & 127 | 128

Это берет младшие 7 битов из значения, а затем устанавливает флаг "продолжить" в результирующем фрагменте.

value >>>= 7

Затем отбрасывает только что закодированные биты и продолжаетс старшими битами значения.

...