2012-04-01 38 views
5

Làm cách nào để chuyển đổi một chuỗi thập lục phân sang tương đương int bit 32 bit của nó bằng ruby? ví dụchuỗi thập lục phân để chuyển đổi int đã ký trong Ruby

a = "fb6d8cf1" #hex string 
[a].pack('H*').unpack('l') #from the documentation it unpacks to its 32 bit signed int 

Nó chuyển đổi để

-242455045 

Nhưng câu trả lời thực tế là

-76706575 

Ông có thể chỉ cho tôi những gì tôi đang làm sai?

Trả lời

3

Bạn có thể lật các byte cho mình để có được xung quanh endian và ký các vấn đề:

>> ['fb6d8cf1'.scan(/[0-9a-f]{2}/i).reverse.join].pack('H*').unpack('l') 
=> [-76706575] 
0

Sử dụng:

class String 
    def to_si(base, lenght = 32) 
    mid = 2**(length-1) 
    max_unsigned = 2**length 
    n = self.to_i base 
    (n>=mid) ? n - max_unsigned : n 
    end 
end 

"fb6d8cf1".to_si 16, 32 
+0

mã làm việc cho số âm. Cảm ơn. Nhưng nó không thành công cho số dương ví dụ như "038a67f90" được hiển thị dưới dạng 950435728 nhưng giá trị thực tế là 59402233 –

3

Có vẻ như bạn đã có một vấn đề về cuối. Điều này sẽ cho kết quả mong muốn:

[a].pack("H*").unpack("l>") 
# => [-76706575] 
["038a67f90"].pack("H*").unpack("l>") 
#=> [59402233] 
+0

bạn đang sử dụng phiên bản ruby ​​nào? bởi vì ngay cả sau khi sử dụng l> tôi vẫn nhận được -242455045 –

+0

ruby ​​1.9.3p125 (2012-02-16 sửa đổi 34643) [x86_64-darwin11.3.0] –

+0

chính xác tài liệu cũng cho biết l> chỉ hoạt động từ 1.9.3. Rất tiếc, tôi không thể nâng cấp ruby ​​trên máy chủ sản xuất và tôi phải tìm cách giải quyết cho câu hỏi này –

Các vấn đề liên quan