#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"