так что я думаю, что это преобразование этого ключа в формат der, а затем объединение его с KEY. это правильно?
Да.
что это делает? to_sizet (key.size) Как вы видите, функция возвращает [num] .pack ('V'). Но я не знаю, что это делает? Я имею в виду [num] .pavck ('V'). что это?
Хорошо, просто посмотрите, что написано в документации по Array#pack
. С модификатором V
он просто преобразует массив в двоичное представление 32-разрядного целого типа без знака.
И что это значит. key.size это strlen of key?
Опять же, документация по Ruby помогает. String#size
действительно длина строки.
что делает эта строка?
KEY = %w(30 81 9F 30 0D 06 09 2A 86 48 86 F7 0D 01 01 01 05 00 03 81 8D 00)
.map{|s| s.hex}.pack('C*')
%(…)
определяет массив, где каждая из его записей, разделенных пробелом, обрабатывается как отдельная строка. %w(one two)
- это сокращение от ["one", "two"]
.
После этого мы должны посмотреть (снова в документации) значения Array#map
и String#hex
.
map
просто применяет операцию к каждому элементу массива и создает новый массив с результатом. Операция s.hex
, то есть каждая строка разбирается как шестнадцатеричное число.
Результат снова упаковывается, на этот раз с помощью операции C*
, которая, согласно документации, преобразует числа в соответствующие им (без знака) 8-битные коды символов.
В итоге: эта строка преобразует шестнадцатеричные значения в строку их соответствующих символов.
Запоздалая мысль: вам действительно нужно установить Ruby и немного поиграть с интерактивной консолью Ruby, irb
. Клавиша в приведенной выше строке уже очень помогает:
$ irb
>> %w(30 81 9F 30 0D 06 09 2A 86 48 86 F7 0D 01 01 01 05 00 03 81 8D 00).map{|s| s.hex}
=> [48, 129, 159, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 1, 5, 0, 3, 129, 141, 0]
>> %w(30 81 9F 30 0D 06 09 2A 86 48 86 F7 0D 01 01 01 05 00 03 81 8D 00).map{|s| s.hex}.pack('C*')
=> "0\201\2370\r\006\t*\206H\206\367\r\001\001\001\005\000\003\201\215\000"