如何以十六进制打印数字,前导零

时间:2014-10-28 10:09:03

标签: ruby hex hexdump leading-zero

是否有更好的方法可以使用前导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"

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

4 个答案:

答案 0 :(得分: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"

可能是&#34; 0#{to_s(16)}&#34;?

中的错误

答案 1 :(得分:1)

对于2位十六进制值,这有效:

def to_hex(int)
  int < 16 ? '0' + int.to_s(16) : int.to_s(16)
end

答案 2 :(得分: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

答案 3 :(得分:-2)

你这样做太复杂了。如果要打印十六进制的前导零的整数,那么它只是

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

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