0

Стоит задача на входе у скрипта 16ричный код ("7200F40004226301"). Этот код в переменную считывается в формате list, и каждый символ имеет расширение как str, И необходимо что-бы скрипт мог с символом работать,как с числом.

for item in content: 
  for symbol in item: 
      k = int(''.join("%02X " % ord( symbol )))

результат:

>> symbol
7
>>> type(symbol)
<class 'str'>
>>> type(k)
<class 'int'>
>>> k
37
>>> hex(k)
'0x25'

Но я хочу сделать чтобы hex(k) = 0x07, а не 0x25. Возможно я изначально неправильно выбрал путь решения задачи, так как профан в программировании.

jfs
  • 52,361
  • передать что, куда? – Flowneee Jan 25 '17 at 16:49
  • я разобрал эту строку посимвольно и мне надо дать понять питону, что каждый символ уже в 16 ричном формате – Gennadiy_G Jan 25 '17 at 17:11
  • 1
    В питоне нет типа числа в 16-ричной системе счисления. Эти числа представляются в виде строки, начинающейся с 0x. – user207200 Jan 25 '17 at 17:20
  • 1
    Покажите результат: print(ascii(ваша_строка)). Что вы хотите получить в результате (тип, значение)? Явно пример ввода вывода, используя Питон синтаксис покажите. – jfs Jan 25 '17 at 17:58
  • int("0x" + str, 16) ? Даже 0x в принципе не нужен. Потом разбирайте как хотите это число. – 0andriy Jan 25 '17 at 19:12
  • О, from binascii import unhexlify – 0andriy Jan 25 '17 at 19:18
  • @jfs Результат команды 'print(ascii(ваша_строка))': '['7200440004226301', '5F0044000445F701',...]'. 'for item in content: for symbol in item: k = int(''.join("%02X " % ord( symbol )))' Этот фрагмент кода разбирает каждый символ на десятичные значения, выводя значения symbol и k получается следующее: symbol: 7
    type(symbol): <class 'str'>
    type(k): <class 'int'>
    k: 37
    hex(k): 0x25.
    И я хочу сделать чтобы 'hex(k) = 0x07', а не '0x25'. Возможно я изначально неправильно выбрал путь решения задачи, так как профан в программировании.
    – Gennadiy_G Jan 25 '17 at 21:35
  • Ну можно миллион решений придумать. Если вам полубайты хочется так получать (кстати, у вас big или little endiannes?), так даже в лоб можно сделать: i = int(xstr, 16); while i: print("%x" % i & 0xf); i = i >> 4. И поставьте себе ipython, будет легче жить. – 0andriy Jan 25 '17 at 22:29
  • @0andriy мне совсем не хочется их получать. Мне по факту из файла надо считать эти коды проанализировать, заменить определённые символы и поместить в конечный файл. Для чего это делается? Потому что СКУД не может работать с разными ключами и надо привести к одному виду. – Gennadiy_G Jan 25 '17 at 23:02
  • @0andriy 'i = int(xstr, 16);' - это подходит =) ! Спасибо большое! Буду дальше писать скрипт – Gennadiy_G Jan 25 '17 at 23:09
  • 1
    Яснее от комментария не стало. Если вы читаете из файла и пишите в файл изменённое содержимое, то покажите несколько байтов из входного файла и на какие байты и по какому правилу вы их хотите заменить. Не помещайте информацию необходимую для ответа в комментарии, отредактируйте ваш вопрос вместо этого (и код с нормальным форматированием добавьте). Если думаете что нашли решение, то опубликуйте его как свой ответ—это явно приветствуется. Возможно вам binascii.unhexlify() поможет. – jfs Jan 26 '17 at 01:45
  • @jfs да судя по всему человек учиться писать код, скорее всего ему просто надо аккуратнее сформулировать задачу. – 0andriy Jan 26 '17 at 02:07
  • Вы правы! Это моя первая задача. Спасибо большое за помощь! – Gennadiy_G Jan 26 '17 at 21:35

2 Answers2

1

Если открыв файл как текст (к примеру, в notepad), вы видите в нём строку 7200F40004226301 (шестнадцатеричные цифры в тексте—Unicode символы: 7 (U+0037 DIGIT SEVEN), 2 (U+0032 DIGIT TWO), 0 (U+0030 DIGIT ZERO), итд) так называемый hexdump (bytes -> hex), то чтобы выполнить обратное преобразование (hex -> bytes) и получить исходную последовательность байт: 0x72, 0x00, 0xF4, ... как тип bytes в Питоне:

>>> import binascii
>>> binascii.unhexlify("7200F40004226301")  # из hex-строки в bytes
b'r\x00\xf4\x00\x04"c\x01'
>>> list(_)
[114, 0, 244, 0, 4, 34, 99, 1]
>>> b'r'[0]  # индексация bytes возвращает индивидуальные байты (int)
114
>>> int("72", 16)  # из hex-строки в int
114
>>> 0x72 == 114 == 0b1110010  # одно и то же число в разных системах исчисления
True

В тексте Питон программы, байты, которые соответствуют печатаемым ASCII символам, могут быть представлены как эти символы, поэтому байт 114 печатается в виде текста как b'r', а не b'\x72' как другие байты. См. Байты - перевод из строки.

jfs
  • 52,361
0

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

tonal
  • 2,061