2013-07-12 36 views
6

Tôi đã tìm thấy nó lạ rằng String # hex trong Ruby không trả lại giá trị hex bên phải cho một char nhất định. Tôi có thể hiểu nhầm phương pháp, nhưng lấy ví dụ sau đây:Chuỗi của Ruby # hex nhầm lẫn

'a'.hex 
=> 10 

Trong khi giá trị hex phù hợp với 'a' sẽ là 61:

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

Tôi có thiếu cái gì? Hex là gì? Bất kỳ gợi ý nào được đánh giá cao!

Cảm ơn

+1

Bạn có ý nghĩa gì với "giá trị hex" cho một ký tự? Bởi vì 'a' là hệ thập lục phân cho 16. Bạn có nghĩa là [mã ASCII] (http://en.wikipedia.org/wiki/ASCII#ASCII_printable_characters)? – rampion

+2

"a" là hệ thập lục phân cho 10. "f" là hex cho 16. –

+2

Thực ra, "f" là hệ thập lục phân cho 15. – robnasby

Trả lời

11

String#hex không cung cấp cho bạn chỉ số ASCII của một nhân vật, đó là cho chuyển đổi một số cơ sở-16 (hex adecimal) từ một chuỗi thành một số nguyên:

% 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 

Vì vậy, nó sử dụng ánh xạ thông thường:

'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 

Nó rất giống với String#to_i khi sử dụng cơ sở 16:

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

Từ các tài liệu:

% 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

Câu trả lời rất toàn diện. Tôi đã xóa câu trả lời trước đây của tôi vì nó không có ý nghĩa gì cả. Cảm ơn bạn đã làm cho nó rõ ràng! – FullOfCaffeine

0

hơn Một lợi thế hơn phương pháp hex. '10 -0 'đến 256.

Cân nhắc bạn muốn so sánh'100'> '20'. Phải trả về true nhưng trả về false. Sử dụng '100'.hex>' 20'.hex. Trả về true. Đó là chính xác hơn.