2013-07-12 3 views
6

Ho trovato strano che String # hex in Ruby non restituisca il giusto valore esadecimale per un dato carattere. Potrei essere equivoco il metodo, ma prendo il seguente esempio:Confusione di # Stringa di Ruby

'a'.hex 
=> 10 

considerando che il valore esadecimale giusta per 'a' sarebbe 61:

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

Mi sto perdendo qualcosa? A cosa serve l'esagono? Ogni suggerimento è apprezzato!

Grazie

+1

Cosa intendi per "valore esadecimale" per un personaggio? Perché 'a' è esadecimale per 16. Vuoi dire [codice ASCII] (http://en.wikipedia.org/wiki/ASCII#ASCII_printable_characters)? – rampion

+2

"a" è esadecimale per 10. "f" è esadecimale per 16. –

+2

In realtà, "f" è esadecimale per 15. – robnasby

risposta

11

String#hex non ti dà l'indice ASCII di un carattere, è per la trasformazione di una base-16 numero (esadecimale adecimal) da una stringa a un numero intero:

% 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 

in modo che utilizza la mappatura normale:

'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 

E 'molto simile a quando si utilizza String#to_i base 16:

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

Dalla documentazione:

% 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

Risposta molto completa. Ho cancellato la mia risposta precedente in quanto non aveva alcun senso. Grazie per aver reso tutto chiaro! – FullOfCaffeine

0

più Un vantaggio rispetto metodo esagono. Da '10 -0 'a 256.

Si consideri che si desidera confrontare '100'> '20'. Dovrebbe restituire true ma restituire false. Usa '100'.hex>' 20'.hex. Restituisce vero. Che è più preciso