2014-10-28 7 views
1

선도를 가진 16 진수를 표시하는 더 좋은 방법이 있습니까? 0? 나는 시도 :선행 0을 사용하여 16 진수를 인쇄하는 방법

i.to_s(16) 

하지만 "02"을 기대

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

합니다. 내가 "0100"을 원하는 2 작동

"%02x" % i 

하지만

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

: 나는 인쇄 형식을 시도했다. 그래서 나는이 함께했다 :

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을 넣어하려는 경우, 시도' "0 # {i.to_s (16)}"'또는' "0 % X"%의 i'. 그러나 이것은 일반적으로 8 진수를 나타냅니다. 일반적인 16 진수 접두사는''% # x "% i'을 사용하여 인쇄 할 수있는'0x'입니다. – Stefan

+0

댓글을 주셔서 감사합니다.하지만 to_s (16)은 BigNumber – Bruno

답변

0

이 방법이 너무 복잡합니다.

의이를 해보자 : 당신이 앞에 0과 16 진수 정수를 인쇄 할 경우, 그것은 네, 버그 그냥

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

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

으로 도청 된 것으로 보입니다. 감사! – Bruno

+0

그러나 bignumber에 버그가있는 것 같습니다. "ff"* 192와 함께 사용하려고하면 bignum으로 변환하여 16 진수로 변환하는 버그가있는 경우 – Bruno

+0

이 대답은 잘못되었습니다. IMHO : 항상 앞에 0을 넣습니다. OP는'2.to_hex_string' = 02의 경우 OP가 앞에 오길 원하지만 '200.to_hex_string'은 '0c8'이 아닌 'c8'을 반환해야합니다. 즉, 선두 0은 홀수 문자열 길이에만 추가되어야합니다. – claus

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

을 그리고 버그는 여기 :

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

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 
관련 문제