nodejs Buffer toString изменил исходный буфер

в node.js

    const buffer = Buffer.from('000000a6', 'hex');
    console.log(buffer); // <Buffer 00 00 00 a6>

    const bufferString = buffer.toString();
    const newBuffer = Buffer.from(bufferString);
    console.log(newBuffer); //  <Buffer 00 00 00 ef bf bd>

Зачем преобразовывать буфер в строку, а затем преобразовывать строку обратно в буфер, если новый буфер отличается от исходного?

Я пробовал toString ('hex') toString ('binary') или другой код, например ascii и т. Д. Все эти кодировки изменили исходный буфер.

buffer.toString (кодировать) использовать кодировку по умолчанию utf8, Buffer.from (строка, кодировать) также использовать кодировку по умолчанию utf8, она все еще отличается.

Как я могу преобразовать буфер в строку и преобразовать его обратно в буфер точно так же, как исходный буфер?

PS: Этот вопрос возникает, когда я хочу отправить тело запроса в виде буфера. Я просто отправляю на сервер, но сервер попадает.

PPS: Сервер мне не подвластен. Поэтому я не могу использовать Buffer.from (string, 'hex') для анализа тела запроса buffer.toString ('hex').


person twincle    schedule 03.11.2017    source источник


Ответы (2)


Нет необходимости преобразовывать в строку типа const bufferString = buffer.toString ();

const buffer = Buffer.from ('000000a6', 'шестнадцатеричный'); console.log (буфер); //

const bufferString = buffer; 
const newBuffer = Buffer.from(bufferString);
console.log(newBuffer);
person selvendiran    schedule 03.11.2017
comment
когда я отправляю запрос, request.body автоматически преобразует буфер в строку с помощью buffer.toString (), я не делал этого вручную. И строка будет получена сервером, но строка изменилась - person twincle; 03.11.2017

Другими словами, вы конвертируете буфер в строку и обратно в буфер, используя одну и ту же кодировку оба раза, а буфер не тот? Вот функция, позволяющая проверить, останется ли входная строка неизменной для данной кодировки. Это должно сказать вам, какие кодировки могут вызвать проблемы.

var f = (buf, enc) => Buffer.from(buf.toString(enc), enc).every((e,i) => e === buf[i]);
f("hello world", "utf16le"); // ==> returns true
f("hello world", "binary"); // ==> returns true

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

person Arlen Beiler    schedule 04.12.2018
comment
Я не понимаю, как кодирование, а затем декодирование не может быть прозрачной операцией с каждым кодированием. По сути, мы берем биты, группируем их и даем им символьный эквивалент. А потом производим обратную операцию. Так когда же меняют биты? - person Sharcoux; 11.09.2020