Buffer.toString ('binary') добавляет «новые символы» - PullRequest
0 голосов
/ 29 сентября 2018

Я пытаюсь сжать / распаковать этот файл: Пример содержимого (которое можно загрузить Корпус Кентербери ).

Когда я читаюиспользуя fs.readFile(path, callback), я получаю буфер, и мне нужно преобразовать этот буфер в строку, чтобы сжать, и после этого нужно снова сохранить его как файл.

Проблема в том, что Buffer.toString('binary'), кажется, изменяет содержимое.

Если я запускаю

console.log('original: ', sumBuffer)
let newBuffer = Buffer.from(sumBuffer.toString('binary'))
console.log('modified: ', newBuffer)

, я получаю это:

оригинал: <Буфер 7f 45 4c 46 01 0201 00 00 00 00 00 00 00 00 00 00 02 00 02 00 00 00 01 00 01 0b 98 00 00 00 34 00 00 91 50 00 00 00 00 00 34 00 20 00 05 00 28 00 1a ...>

изменено: <Буфер 7f 45 4c 46 01 02 01 00 00 00 00 00 00 00 00 00 00 02 00 02 00 00 00 01 00 01 0b c2 98 00 00 00 34 00 00 c2 91 50 00 00 00 0000 34 00 20 00 05 00 28 ...>

Во втором есть символ c2, появляющийся там, где раньше ничего не было.

modified: <Buffer 7f 45 4c 46 01 02 01 00 00 00 00 00 00 00 00 00 00 02 00 02 00 00 00 01 00 01 0b >>c2<< 98 00 00 00 34 00 00 >>c2<< 91 50 00 00 00 00 00 34 00 20 00 05 00 28 ... >

Почему это происходит?Как мне от этого избавиться?

Заранее спасибо.

1 Ответ

0 голосов
/ 29 сентября 2018

Buffer.from функция со строкой в ​​качестве первого аргумента принимает второй необязательный аргумент encoding, который по умолчанию равен utf8

Итак, ваш код эквивалентен

let newBuffer = Buffer.from(sumBuffer.toString('binary'), 'utf8');

Поскольку sumBuffer явно двоичный файл, вам нужно будет

let newBuffer = Buffer.from(sumBuffer.toString('binary'), 'binary');

Обратите внимание, это то же самое, что и

let newBuffer = Buffer.from(sumBuffer);

Однако, как вы указали«реальный код» немного сложнее - я просто почувствовал необходимость указать его на случай, если придет какой-нибудь придурок и скажет «но почему бы вам просто…»: p

...