2011-01-20 89 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