我想将十六进制字符串转换为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
答案 0 :(得分:4)
c
指令非常接近,但它需要不同的输入:表示带符号的8位整数的单个字符。这需要输入"0xff"
为"\xff"
。因此,必须首先进行此转换。这里可以使用至少一种您已知的方法;另一个是Integer#chr
:
"0xff".hex.chr # => "\xFF"
完整的解决方案:
"0xff".hex.chr.unpack1(?c) # => -1