Объяснение использования буфера

#javascript #arrays #node.js #ecmascript-6 #caesar-cipher

#javascript #массивы #node.js #ecmascript-6 #caesar-cipher

Вопрос:

Я нашел это гениальное решение caesar cipher на codefights. Я пытаюсь понять, что здесь делает буфер.

 b=Buffer
caesarian = (m, n) =>
  ""   b([...b(m)].map(x => (n % 26   x   7) % 26   97))
 

Могут ли пустые строки объединяться с такими типизированными массивами?

Комментарии:

1. Струны? Типизированные массивы? Где вы это видите? Пожалуйста, покажите пример вызова и что вы в нем не понимаете или как бы вы написали его без буферов.

2. Разве конструктор буфера не создает типизированный массив? Я этого не писал. Я наткнулся на это и пытаюсь это понять.

3. Это Node.js Buffer , верно? вы должны использовать Node.js бирка.

4. @epiqueras Нет ?

Ответ №1:

Повторение a Node.js Buffer выдает свои данные по одному байту за раз. Для буфера (с кодировкой по умолчанию utf8), который содержит буквенно-цифровые символы, это то же самое, что получение ASCII-кода каждого символа:

 [...Buffer("hello")] // [ 104, 101, 108, 108, 111 ]
 

(n % 26 x 7) % 26 97) является ли арифметика шифра Цезаря над ASCII — я думаю, вы знакомы с этой частью.

Итак, этот фрагмент интерпретирует строку как массив кодов ASCII и преобразует их в соответствующие выходные данные:

 [...b(m)].map(x => (n % 26   x   7) % 26   97))
 

Вы можете инициализировать a Buffer с помощью массива байтовых значений:

 Buffer([97]) // <Buffer 61>
 

Вы можете получить строковое представление чего-либо в JavaScript, объединив его с пустой строкой, так "" b([97]) же, как Buffer([97]).toString() . Buffer#toString интерпретирует сохраненные байты как символы Юникода:

 ""   Buffer([97]) // 'a'
 

Поэтому смысл внешнего "" b(/* ... */) заключается в том, чтобы превратить обработанные ASCII-коды обратно в буквенно-цифровые символы для отображения.

Комментарии:

1. Отличный ответ, спасибо! Вы уверены, что можете объединить любой объект со строкой? «Привет» [0, 1, 2, 3]?

2. Да. Это "Hello0,1,2,3"