十六进制字符串到Ruby中的signed int转换

时间:2012-04-01 10:32:42

标签: ruby

如何在Ruby中将十六进制strign转换为32位signed int当量? 例如

a = "fb6d8cf1" #hex string
[a].pack('H*').unpack('l') #from the documentation it unpacks to its 32 bit signed int

转换为

-242455045

但实际答案是

-76706575 

你能指出我做错了吗?

3 个答案:

答案 0 :(得分:4)

好像你有一个字节序问题。这给出了期望的结果:

[a].pack("H*").unpack("l>")
# => [-76706575]
["038a67f90"].pack("H*").unpack("l>")
#=> [59402233]

答案 1 :(得分:3)

您可以自己翻转字节以绕过字节序并签署问题:

>> ['fb6d8cf1'.scan(/[0-9a-f]{2}/i).reverse.join].pack('H*').unpack('l')
=> [-76706575]

答案 2 :(得分:0)

使用:

class String
  def to_si(base, lenght = 32)
    mid = 2**(length-1)
    max_unsigned = 2**length
    n = self.to_i base
    (n>=mid) ? n - max_unsigned : n
  end
end

"fb6d8cf1".to_si 16, 32