2011-09-29 5 views
6

Tôi đang gặp một số khó khăn khi thay đổi một hex thành int/char (char tốt hơn). Thông qua trang web; http://home2.paulschou.net/tools/xlate/ Tôi nhập hex của C0A80026 vào hộp hex, trong ô DEC/CHAR nó kết quả đầu ra đúng IP tôi dự kiến ​​nó chứa.Python - Chuyển đổi Hex thành INT/CHAR

Dữ liệu này đang được lấy từ cơ sở dữ liệu bên ngoài và tôi không biết nó đang được lưu như thế nào, tất cả những gì tôi phải làm việc là chính chuỗi hex.

Tôi đã thử sử dụng chức năng binascii.unhexlify để xem tôi có thể giải mã được không nhưng tôi sợ rằng tôi có thể không có đủ hiểu biết về hex để đánh giá cao những gì tôi đang làm.

Việc tính toán để in chỉ bằng cách sử dụng đoạn int() cũng không tạo ra kết quả được yêu cầu. Tôi cần một số cách để chuyển đổi từ đó chuỗi hex (hoặc một tương tự) để IP ban đầu.

CẬP NHẬT: Đối với bất kỳ ai gặp phải điều này trong tương lai, tôi đã sửa đổi câu trả lời dưới đây một chút để cung cấp bản in chính xác làm IP bằng cách sử dụng;

dec_output = str(int(hex_input[0:2], 16)) + "." + str(int(hex_input[2:4], 16)) + "." + str(int(hex_input[4:6], 16)) + "." + str(int(hex_input[6:8], 16)) 
+0

thể trùng lặp của [Chuyển đổi chuỗi hex để int bằng Python] (http://stackoverflow.com/questions/ 209513/convert-hex-string-to-int-in-python) –

+0

Giải pháp đó không hoạt động với sự cố của tôi – Draineh

+0

Vui lòng giải thích chính xác cách câu hỏi trùng lặp không trùng lặp. Chi tiết quan trọng. "không làm việc với vấn đề của tôi" là quá mơ hồ để có nghĩa là bất cứ điều gì. –

Trả lời

6

Nếu bạn muốn để có được 4 con số riêng biệt từ này, sau đó đối xử với nó như 4 số riêng biệt. Bạn không cần binascii.

hex_input = 'C0A80026' 
dec_output = [ 
    int(hex_input[0:2], 16), int(hex_input[2:4], 16), 
    int(hex_input[4:6], 16), int(hex_input[6:8], 16), 
] 
print dec_output # [192, 168, 0, 38] 

Điều này có thể được khái quát hóa, nhưng tôi sẽ để nó như là một bài tập cho bạn.

+0

Hoàn hảo, cảm ơn bạn – Draineh

0

Tôi hy vọng đó là những gì bạn mong đợi:

hex_val = 0x42424242  # hexadecimal value 
int_val = int(hex_val) # integer value 
str_val = str(int_val) # string representation of integer value 
+0

Chữ '0x4242422' đã tạo một số nguyên, 'int (hex_val)' là thừa. –

4

Bạn cũng có thể cần các chức năng chr:

chr(65) => 'A' 
+0

chr chỉ chấp nhận số nguyên câu hỏi nêu rõ rằng người dùng cần chuyển đổi hex trong int/char (không phải int thành char) và chr chỉ chấp nhận số nguyên sao cho đây không phải là giải pháp. –

1
>>> htext='C0A80026' 
>>> [int(htext[i:i+2],16) for i in range(0,len(htext),2)] 
# [192, 168, 0, 38] 
6

Một cách đơn giản

>>> s = 'C0A80026' 
>>> map(ord, s.decode('hex')) 
[192, 168, 0, 38] 
>>> 

nếu bạn thích comprehensions danh sách

>>> [ord(c) for c in s.decode('hex')] 
[192, 168, 0, 38] 
>>> 
+0

Đẹp nhất.Tôi muốn _personally_ viết nó như là một danh sách hiểu, nhưng đó là hoàn toàn hương vị. Tôi thích sử dụng 'decode' và' ord'. – neil

+0

cảm ơn @neil. Tôi cũng thích tính năng hiểu danh sách. –