Как объект класса Buffer в Node.js преобразует данные в данном случае?
let buff = Buffer.from('A');
console.log('A'.charCodeAt(0)); // код символа "А" - 65
console.log(buff); // 41
console.log(buff.length); // 1
Вопрос 1 : если я правильно понимаю, то в данном случае объект buff будет состоять из шестнадцатиричного представления числа 65? И длина его будет 1 байт?
Вопрос 2 : из теории про буфер я узнал, что вроде как компьютеры же могут читать только двоичную систему счисления, т.е. 010101... Поэтому буфер в какой-то (непонятный момент для меня) должен преобразовать вот этот шестнадцатеричный код в двоичный ну и соответственно обратно?
let buff = Buffer.from('№');
console.log('№'.charCodeAt( 0 )); // код символа "№" - 8470
console.log(buff); // e2 84 96
console.log(buff.length); // 3
Вопрос 3 : Что в данном случае происходит ? Единственное, что я понял, это то, что длина (или размер, хм?) данного буфера — 3 байта! Но как происходит конвертация подобных символов? Я пробовал, ни под одну систему счисления у меня не совпал данный массив [ e2 84 96 ], видимо, я чот и в первом случае нe так понимаю! Если можно, объясните на более простых примерах (можно абстрактных), я учу эту азбуку с нуля, и не хотелось бы быть одним из тех, кто всё поверхностно хватает, довольствуясь инфой о том, что "буфер это ящик", а "буферизация это когда инэт тормозит"! Спасибо!
Ответы (1 шт):
Чтобы понимать, что происходит, вам нужно иметь минимальную теоретическую базу относительно кодирования текста и его реализации в JavaScript. Если читаете на английском, вот несколько полезных ссылок:
- http://www.joelonsoftware.com/articles/Unicode.html
- https://dmitripavlutin.com/what-every-javascript-developer-should-know-about-unicode/
- https://blog.jonnew.com/posts/poo-dot-length-equals-two
- https://ponyfoo.com/articles/es6-strings-and-unicode-in-depth
- https://mathiasbynens.be/notes/javascript-unicode
- https://mathiasbynens.be/notes/es6-unicode-regex
Если отвечать на ваши вопросы вкратце (хотя понять это без базы будет, возможно, нелегко):
1-2. Буфер просто хранит числа от 0 до 255 (то есть числа, которые помещаются в один байт). Как они будут представлены, зависит от того, как вы их выведите. Внутри компьютера они хранятся в бинарном формате. А в консоль по умолчанию выводятся в шестнадцатеричном.
3. Buffer.from() по умолчанию сохраняет текст в буфере в кодировке UTF-8. Символ № в кодировке UTF-8 будет состоять из 3 байтов, которые вы и видите в виде 3-х шестнадцатеричных чисел. Посмотреть разные способы кодировки символа можно, например, здесь: https://www.fileformat.info/info/unicode/char/2116/index.htm