将十六进制字符串表示法中的整数转换为带符号的8位整数

时间:2018-03-21 10:53:11

标签: ruby integer hex

我想将十六进制字符串转换为8位签名整数,如以下示例所示:

irb> "0xff".unpack(X)
=> [-1]

缺少 X 的正确值。

通过重新https://ruby-doc.org/core-2.3.0/String.html#method-i-unpack并进行试验,我找不到 X 的正确值。

我可以自己编写代码,就像在这里发布的那样:https://www.ruby-forum.com/topic/138200#615299但是我确信,有一种更优雅简洁的红宝石方式。

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

注意:对于 联合 签名案例,这很容易:

irb> "e0".hex
=> 224

1 个答案:

答案 0 :(得分:4)

c指令非常接近,但它需要不同的输入:表示带符号的8位整数的单个字符。这需要输入"0xff""\xff"。因此,必须首先进行此转换。这里可以使用至少一种您已知的方法;另一个是Integer#chr

"0xff".hex.chr # => "\xFF"

完整的解决方案:

"0xff".hex.chr.unpack1(?c) # => -1