【发布时间】:2018-08-30 11:01:29
【问题描述】:
我想将一个十六进制字符串转换成一个8位有符号整数,如下例所示:
irb> "0xff".unpack(X)
=> [-1]
X 的正确值丢失。
通过 reding https://ruby-doc.org/core-2.3.0/String.html#method-i-unpack 并进行试验,我找不到 X 的正确值。
我可以自己编写代码,就像在这里发布的一样:https://www.ruby-forum.com/topic/138200#615299 但我相信,有一种更优雅简洁的 ruby 方式。
irb> length = 8
irb> mid = 2**(length-1)
irb> max_unsigned = 2**length
irb> to_signed = proc {|n| (n>=mid) ? n - max_unsigned : n}
irb> to_signed["0xFF".to_i(16)]
=> -1
注意:对于 unsinged 的情况,这很简单:
irb> "e0".hex
=> 224
【问题讨论】: