2014-10-28 49 views
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" 

它的工作原理也与Bignumber类,但它看起来很奇怪,这样一个简单的请求需要这样的伎俩。有什么更好的想法

+5

如果你只想把一个零在号码前面,尝试' “0#{i.to_s(16)}”'或' “0%X” %i'。但是这通常表示一个八进制数。常用的十六进制前缀是“0x”,可以使用“%#x”%i“打印。 – Stefan 2014-10-28 11:15:34

+0

感谢您的评论,但似乎to_s(16)与BigNumber – Bruno 2014-10-31 16:16:02

回答

0

你正在使这种方式太复杂。如果你要打印带前导零十六进制整数,那么它只是

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

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

错误地确定它是这样更容易!谢谢! – Bruno 2014-10-28 15:17:45

+0

但它似乎是笨号的bug。如果您尝试使用“ff”* 192例,如果将bug转换为bignum并返回十六进制 – Bruno 2014-10-28 15:34:14

+0

这个答案是错误的恕我直言:它总是在前面放一个0。我认为在'2.to_hex_string' = 02的情况下OP需要0,但是'200.to_hex_string'可能应该返回“c8”而不是“0c8”,即前导0应该只加在奇数字符串长度上。 – claus 2016-11-25 09:33:30

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 # => 24103124269210325885801166060283141129120932479456889513596750390652573915918032006690850241073460496634487662808880047878624169787949583249696129878907746514552133393816252247707820779176814996768455431373878200575973458579045991094613871220995079649978156413423006776294733552816174284117941639677858703703689691092215919430542320115627584500805795878509009937148922834766466311815150638048733751822605062469928378987059710125258433244

而且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)}”?

+0

没人,有什么想法?错误? – Bruno 2014-11-03 12:37:33

0

这是我刚刚尝试解决此问题时在Google上的第一次打击。我不得不找到其他几个帖子来完成我的解决方案,但我认为这很干净。

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