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

Ruby 将十六进制字符串表示法中的整数转换为有符号8位整数,ruby,integer,hex,Ruby,Integer,Hex,我想将十六进制字符串转换为8位有符号整数,如下例所示: irb> "0xff".unpack(X) => [-1] 缺少X的正确值 通过重新编辑和实验,我没有找到X的正确值 我可以自己编写代码,就像在这里发布的一样:但我相信,有一种更优雅简洁的ruby方式 irb> length = 8 irb> mid = 2**(length-1) irb> max_unsigned = 2**length irb> to_signed = proc {|n| (n&

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

irb> "0xff".unpack(X)
=> [-1]
缺少X的正确值

通过重新编辑和实验,我没有找到X的正确值


我可以自己编写代码,就像在这里发布的一样:但我相信,有一种更优雅简洁的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

注意:对于烧毛的情况,这很容易:

irb> "e0".hex
=> 224

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

完整的解决方案是:

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

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

完整的解决方案是:

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