1

有没有更好的方法以十六进制显示数字并带有前导0?我试过了:

i.to_s(16)

2.to_s(16) #=> "2" 

我期望的地方"02"。我尝试了打印格式:

"%02x" % i

适用于2,但是

"%02x" % 256 #=> "100"

我想要的地方"0100"。所以我想出了这个:

class Integer
  def to_hex_string
    ("%0x" % self).size % 2 == 0 ? "%0x" % self : "%0#{("%0x" % self).size+1}x" % self
  end
end

有用:

2.to_hex_string #=> "02"
256.to_hex_string #=> "0100"

它也适用于 class Bignumber,但看起来很奇怪,如此简单的请求需要这样的技巧。有更好的主意吗?

4

4 回答 4

1

是的,它的错误:

让我们试试这个:

class Integer
  def to_hex_string
     "0#{to_s(16)}"
  end
end

class BigNumber
  def to_hex_string
    "0#{to_s(16)}"
  end
end

class String
  def to_hex_string
    self.unpack('H*').first
  end

  def to_bytes_string
    unless self.size % 2 == 0
      raise "Can't translate a string unless it has an even number of digits"
    end
    raise "Can't translate non-hex characters" if self =~ /[^0-9A-Fa-f]/
    [self].pack('H*')
  end

  def to_bignum
    self.bytes.inject { |a,b| (a << 8) + b }
  end
end

p a="ff"*192 # => "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"

p bytestring=a.to_bytes_string # => "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"

p bytestring.to_hex_string # => "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"

p biga=a.to_bytes_string.to_bignum # => 2410312426921032588580116606028314112912093247945688951359675039065257391591803200669085024107346049663448766280888004787862416978794958324969612987890774651455213339381625224770782077917681499676845543137387820057597345857904599109461387122099507964997815641342300677629473355281617428411794163967785870370368969109221591943054232011562758450080579587850900993714892283476646631181515063804873375182260506246992837898705971012525843324401232986857004760339316735

而BUG就在这里:

p biga.to_hex_string # => "0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"

这个0是哪里来的???

更奇怪的是我的复杂解决方案正在起作用:

p ("%0x" % biga).size % 2 == 0 ? "%0x" % biga : "%0#{("%0x" % biga).size+1}x" % biga # => "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"

也许是“0#{to_s(16)}”中的错误?

于 2014-10-28T16:41:53.240 回答
1

对于 2 位十六进制值,此方法有效:

def to_hex(int)
  int < 16 ? '0' + int.to_s(16) : int.to_s(16)
end
于 2018-04-24T19:44:46.993 回答
0

当我试图解决这个问题时,这是谷歌上的第一个热门话题。我必须找到其他几个帖子来完成我的解决方案,但我认为这很干净。

class Fixnum
  def to_hex(bits)
    rjust = (bits/4 + (bits.modulo(4)==0 ? 0 : 1))
    "0x" + self.to_s(16).rjust(rjust, "0")
  end
end
于 2017-09-24T11:13:56.583 回答
-2

你让这种方式太复杂了。如果你想打印一个带有前导零的十六进制整数,那么它只是

class Integer
  def to_hex_string
    "0#{to_s(16)}"
  end
end

2.to_hex_string   # => 02
256.to_hex_string # => 0100
于 2014-10-28T13:33:17.263 回答