【问题标题】:Help needed in converting a few lines of ruby code to c++!将几行 ruby​​ 代码转换为 c++ 需要帮助!
【发布时间】:2011-06-12 08:56:02
【问题描述】:

我必须将以下代码转换为 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 是 key 的 strlen 吗?

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

【问题讨论】:

    标签: c++ ruby qt openssl


    【解决方案1】:

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

    是的。

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

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

    这是什么意思。 key.size 是 key 的 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"
    

    【讨论】:

    • 感谢您的详细解释。这太棒了。我还有一个问题,你能告诉我这条线是做什么的吗?键 = %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*') 当然在 ruby​​ 中!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多