Python - Преобразование Hex в INT / CHAR - PullRequest
6 голосов
/ 29 сентября 2011

У меня возникли трудности с изменением гекса на int / char (предпочтительно char).Через сайт;http://home2.paulschou.net/tools/xlate/ Я ввожу шестнадцатеричный C0A80026 в шестнадцатеричное поле, в поле DEC / CHAR он правильно выводит IP-адрес, который я ожидал в нем содержать.

Эти данные извлекаются из внешней базы данных иЯ не знаю, как он сохраняется, поэтому все, с чем мне нужно работать, это сама шестнадцатеричная строка.

Я пытался использовать функцию binascii.unhexlify, чтобы посмотреть, смогу ли я ее декодировать, но боюсь, что могуне достаточно хорошо разбираюсь в гексагоне, чтобы понять, что я делаю.

Попытка печати с использованием только приведения типа int () также не дала требуемых результатов.Мне нужно каким-то образом преобразовать эту шестнадцатеричную строку (или одну подобную) в исходный IP-адрес.

ОБНОВЛЕНИЕ: для тех, кто сталкивается с этим в будущем, я слегка изменил приведенный ниже ответ, чтобы получить точную распечатку в видеIP с помощью;

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))

Ответы [ 6 ]

7 голосов
/ 29 сентября 2011

Простой способ

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

если вы предпочитаете списочные выражения

>>> [ord(c) for c in s.decode('hex')]
[192, 168, 0, 38]
>>> 
6 голосов
/ 29 сентября 2011

Если вы хотите получить 4 отдельных номера из этого, то рассматривайте это как 4 отдельных номера.Вам не нужно 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]

Это можно обобщить, но я оставлю это как упражнение для вас.

4 голосов
/ 29 сентября 2011

Вам также может понадобиться функция chr:

chr(65) => 'A'
1 голос
/ 29 сентября 2011
>>> htext='C0A80026'
>>> [int(htext[i:i+2],16) for i in range(0,len(htext),2)]
# [192, 168, 0, 38]
0 голосов
/ 24 апреля 2018

Для преобразования шестнадцатеричной строки в читаемую человеком строку вы можете экранировать каждый символ HEX следующим образом:

>>> '\x68\x65\x6c\x6c\x6f'
'hello'

из строки вы можете легко зацикливаться на списке INT:

>>> hextoint = [ord(c) for c in '\x68\x65\x6c\x6c\x6f']
>>> _
[104, 101, 108, 108, 111]

Ваш пример:

>>> [ord(c) for c in '\xC0\xA8\x00\x26']
[192, 168, 0, 38]
0 голосов
/ 29 сентября 2011

Я надеюсь, что это то, что вы ожидаете:

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