Ruby String # hex confusion

It seemed strange to me that String # hex in Ruby does not return the correct hexadecimal value for a given char. Perhaps I am mistaken in the method, but I will make the following example:

'a'.hex => 10 

While the correct hexadecimal value for 'a' is 61:

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

Am I missing something? What is hex for? Any hints appreciated!

thanks

+6
source share
2 answers

String#hex does not give you the ASCII index of a character, it is intended to convert the base-16 ( hex adecimal) number from a string to an integer:

 % 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 

Therefore, it uses 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 

It is very similar to String#to_i when using base 16:

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

From the docs:

 % 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 
+11
source

Another advantage over the hex method. '10 -0 'to 256.

Suppose you want to compare '100'> '20'. Should return true, but returns false. Use '100'.hex>' 20'.hex. Returns true. Which is more accurate.

0
source

Source: https://habr.com/ru/post/949275/


All Articles