2011-01-20 1 views
1

Мне нужно преобразовать следующий код в Qt C++ Так что мне нужно понять, к чему эти строки.Помощь, необходимая для преобразования нескольких строк кода ruby ​​в C++!

@key в этом коде является PEM ключ содержимого файла по OpenSSL

key = [email protected]_key.to_der 
  1. так я думаю, что это преобразование, что ключ к дер формат и затем комбинируя ее с ключом. Правильно?

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

  3. И что это значит. key.size - это ключ ключа?

def write_crx 
    print "write crx..." if @verbose 
    key = [email protected]_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*') 

ответ

4

так я думаю, что это преобразование, что ключ к дер формат и затем комбинируя ее с ключом. это правильно?

Да.

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

Ну, просто взгляните на то, что говорится в документации на Array#pack. С модификатором V он просто преобразует массив в двоичное представление 32-битного беззнакового целочисленного типа.

И что это значит. key.size - это ключ ключа?

Опять же, документация по 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) is essentially a shorthand for ["one", "two"].

После этого мы должны искать (опять же в документации) значения Array#map и String#hex.

map просто применяет операцию к каждому элементу массива и создает новый массив с результатом. Операция s.hex - то есть разбор каждой строки в виде шестнадцатеричного числа.

Результат снова упакован, на этот раз с использованием операции C*, которая, как указывается в документации, преобразует числа в соответствующие 8-разрядные коды символов без знака.

Таким образом: эта строка преобразует шестнадцатеричные значения в строку соответствующих символов.

Afterthought: Вы должны действительно установить 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" 
+0

Благодарим за подробное объяснение. Это было превосходно. У меня есть еще один вопрос, можете ли вы рассказать, что делает эта линия? 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 *') конечно в рубине! – defiant

+1

@oDx См. Обновление. –