2011-01-20 117 views
1

我必須將下面的代碼轉換爲Qt C++ 所以我需要了解這些行是什麼。將幾行ruby代碼轉換爲C++需要幫助!

@key在此代碼是由OpenSSL的

key = [email protected]_key.to_der 
  1. 一個PEM密鑰文件的內容,所以我認爲這是轉換是關鍵DER格式,然後將其與密鑰進行組合。 是不是?

  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

,所以我認爲這是轉換是關鍵DER格式,然後將其與密鑰進行組合。這樣對嗎?

是的。

這是幹什麼的? 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#mapString#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" 
+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 2011-01-20 11:09:26