2013-07-12 5 views
6

Ich habe es seltsam gefunden, dass String # hex in Ruby nicht den richtigen Hex-Wert für ein bestimmtes Zeichen zurückgibt. Ich könnte Mißverständnis die Methode sein, aber nehmen Sie das folgende Beispiel:Ruby's String # hex Verwirrung

'a'.hex 
=> 10 

Während der rechte Hex-Wert für ‚a‘ 61 sein würde:

'a'.unpack('H*') 
=> 61 

Bin ich etwas fehlt? Wofür ist Hex? Alle Hinweise geschätzt!

Dank

+1

Was meinen Sie mit "hex value" für ein Zeichen? Weil 'a' für 16 hexadezimal ist. Meinst du [ASCII-Code] (http://en.wikipedia.org/wiki/ASCII#ASCII_printable_characters)? – rampion

+2

"a" ist hexadezimal für 10. "f" ist hex für 16. –

+2

Tatsächlich ist "f" hexadezimal für 15. – robnasby

Antwort

11

String#hex Sie nicht den ASCII-Index eines Zeichens nicht geben, es ist für eine Basis-16-Nummer (hex adecimal) aus einem String in eine Ganzzahl umzuwandeln:

% ri String\#hex 
String#hex 

(from ruby site) 
------------------------------------------------------------------------------ 
    str.hex -> integer 


------------------------------------------------------------------------------ 

Treats leading characters from str as a string of hexadecimal digits 
(with an optional sign and an optional 0x) and returns the 
corresponding number. Zero is returned on error. 

    "0x0a".hex  #=> 10 
    "-1234".hex #=> -4660 
    "0".hex  #=> 0 
    "wombat".hex #=> 0 

so verwendet er das Normal Mapping:

'0'.hex #=> 0 
'1'.hex #=> 1 
... 
'9'.hex #=> 9 
'a'.hex #=> 10 == 0xA 
'b'.hex #=> 11 
... 
'f'.hex #=> 15 == 0xF == 0x0F 
'10'.hex #=> 16 == 0x10 
'11'.hex #=> 17 == 0x11 
... 
'ff'.hex #=> 255 == 0xFF 

es ist sehr ähnlich zu String#to_i wenn Basis mit 16:

'0xff'.to_i(16) #=> 255 
'FF'.to_i(16) #=> 255 
'-FF'.to_i(16) #=> -255 

Aus der Dokumentation:

% ri String\#to_i 
String#to_i 

(from ruby site) 
------------------------------------------------------------------------------ 
    str.to_i(base=10) -> integer 


------------------------------------------------------------------------------ 

Returns the result of interpreting leading characters in str as an 
integer base base (between 2 and 36). Extraneous characters past the 
end of a valid number are ignored. If there is not a valid number at the start 
of str, 0 is returned. This method never raises an exception 
when base is valid. 

    "12345".to_i    #=> 12345 
    "99 red balloons".to_i #=> 99 
    "0a".to_i    #=> 0 
    "0a".to_i(16)   #=> 10 
    "hello".to_i    #=> 0 
    "1100101".to_i(2)  #=> 101 
    "1100101".to_i(8)  #=> 294977 
    "1100101".to_i(10)  #=> 1100101 
    "1100101".to_i(16)  #=> 17826049 
+0

Sehr umfassende Antwort. Ich löschte meine vorherige Antwort, da sie überhaupt keinen Sinn ergab. Danke, dass du alles klar gemacht hast! – FullOfCaffeine

0

Ein weiterer Vorteil gegenüber Hex-Methode. '10 -0 'bis 256.

Betrachten Sie möchten vergleichen' 100 '>' 20 '. Sollte Wahr zurückgeben, aber Falsch zurückgeben. Verwenden Sie '100'.hex>' 20'.hex. Gibt wahr zurück. Welches ist genauer.