2013-07-12 4 views
6

Мне показалось странным, что String # hex в Ruby не возвращает правильное шестнадцатеричное значение для данного символа. Я мог бы быть недопонимание метод, но следующий пример:Ruby's String # hex confusion

'a'.hex 
=> 10 

В то время как правая шестнадцатеричное значение для «а» будет 61:

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

Я пропускаю что-то? Для чего нужен hex? Любые намеки оценили!

Благодаря

+1

Что вы подразумеваете под «шестнадцатеричным значением» для персонажа? Потому что 'a' является шестнадцатеричным для 16. Вы имеете в виду [код ASCII] (http://en.wikipedia.org/wiki/ASCII#ASCII_printable_characters)? – rampion

+2

«a» является шестнадцатеричным для 10. «f» является шестнадцатеричным для 16. –

+2

Фактически «f» является шестнадцатеричным для 15. – robnasby

ответ

11

String#hex не дает вам индекс ASCII символа, то для преобразования базовых 16 числа (шестигранной adecimal) из строки в целое число:

% 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 

Таким образом, он использует нормальное отображение:

'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 

это очень похоже на String#to_i при использовании базы 16:

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

Из документов:

% 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

Очень полный ответ. Я удалил свой предыдущий ответ, поскольку это не имело никакого смысла. Спасибо, что поняли! – FullOfCaffeine

0

Еще одно преимущество по сравнению с методом шестигранной. '10 -0 'до 256.

Рассмотрите, что вы хотите сравнить '100'> '20'. Должен возвращать true, но возвращает false. Используйте '100'.hex>' 20'.hex. Возвращает true. Что более точно.