Ruby中十六进制字符串到有符号整数的转换

Ruby中十六进制字符串到有符号整数的转换,ruby,Ruby,在ruby中,如何将十六进制strign转换为它的32位带符号int等价物? 比如说 a = "fb6d8cf1" #hex string [a].pack('H*').unpack('l') #from the documentation it unpacks to its 32 bit signed int 它转换为 -242455045 但实际的答案是 -76706575 你能指出我做错了什么吗?使用: class String def to_si(base, lenght =

在ruby中,如何将十六进制strign转换为它的32位带符号int等价物? 比如说

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

-242455045
但实际的答案是

-76706575 
你能指出我做错了什么吗?

使用:

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

看起来你有个endian问题。这将产生预期的结果:

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

您可以自己翻转字节以绕过endian和签名问题:

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

该代码适用于负数。谢谢但是对于正数,它失败了,例如“038a67f90”被渲染为950435728,但实际值是59402233您使用的是哪个版本的ruby?因为即使在使用了l>之后,我仍然得到了-242455045ruby 1.9.3p125(2012-02-16修订版34643)[x86_64-darwin11.3.0]确切地说,文档中还说l>只能从1.9.3开始工作。不幸的是,我无法在生产服务器上升级ruby,我必须找到一个解决方法。您最初的问题没有指定ruby版本,所以我选择了我所拥有的。当然。没问题迈克:)谢谢你的解决方案