【问题标题】:Convert Integer in Hex String Notation into a signed 8-Bit Integer将十六进制字符串表示法中的整数转换为有符号的 8 位整数
【发布时间】: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

【问题讨论】:

    标签: ruby integer hex


    【解决方案1】:

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

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

    以及完整的解决方案:

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

    【讨论】:

      猜你喜欢
      • 2014-10-19
      • 2021-11-05
      • 2019-05-03
      • 2021-08-13
      • 2013-04-09
      • 1970-01-01
      • 2012-08-29
      相关资源
      最近更新 更多