将几行ruby代码转换为c ++所需的帮助!

时间:2011-01-20 10:32:24

标签: c++ ruby qt openssl

我必须将以下代码转换为Qt c ++ 所以我需要了解这些内容是什么。

此代码中的@key是openssl

的pem密钥文件内容
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吗?

  4. 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 个答案:

答案 0 :(得分:4)

  

所以我认为这是将该密钥转换为der格式,然后将其与KEY组合。是不是?

  

这是做什么用的? to_sizet(key.size)如您所见,该函数返回[num] .pack('V')。但我不知道它会做什么?我的意思是[num] .pavck('V')。它是什么?

好吧,看看Array#pack上的文档说明了什么。使用V修饰符,它只是将数组转换为32位无符号整数类型的二进制表示。

  

这是什么意思。 key.size是关键的strlen吗?

同样,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"