Нужна помощь в преобразовании нескольких строк кода ruby ​​в c ++! - PullRequest
1 голос
/ 20 января 2011

Я должен преобразовать следующий код в Qt c ++ Поэтому мне нужно понять, к чему эти строки.

@ ключ в этом коде является содержимым файла ключа pem от openssl

key = KEY+@key.public_key.to_der
  1. так что я думаю, что это преобразование этого ключа в формат der, а затем объединение его с KEY. это правильно?

  2. что это делает? to_sizet (key.size) Как видите, функция возвращает [num] .pack ('V'). Но я не знаю, что это делает? Я имею в виду [num] .pavck ('V'). что это?

  3. И что это значит. key.size это strlen of key?

def write_crx
   print "write crx..." if @verbose
   key = KEY+@key.public_key.to_der
   File.open(@crx, 'wb') do |file|
     file << MAGIC
     file << EXT_VERSION
     file << to_sizet(key.size)
     file << to_sizet(@sig.size)
     file << key
     file << @sig
     File.open(@zip, 'rb') do |zip|
       file << zip.read
     end
   end
   puts "done at \"#{@crx}\"" if @verbose
 end
 def to_sizet num
   return [num].pack('V')
 end

Ну, у меня есть еще один вопрос. Забыл добавить в прошлый раз. что делает эта строка?

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*')

1 Ответ

4 голосов
/ 20 января 2011

так что я думаю, что это преобразование этого ключа в формат 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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...