#python #python-2.7 #character-encoding #hex
#python #python-2.7 #кодировка символов #шестнадцатеричный
Вопрос:
У меня есть шестнадцатеричный файл из первых 100 миллионов цифр числа pi после десятичной дроби, в шестнадцатеричном редакторе он выглядит так:
14 15 92 65 35 89 79 32 etc.
Мне нужно преобразовать это в строку (и, в конечном итоге, целое число) ‘1415926435897932’ и т.д. Поэтому его не нужно «преобразовывать» из шестнадцатеричного в десятичный, он уже десятичный, как шестнадцатеричные байты. (Я использовал слово «буквальный» в кавычках в названии, вероятно, это совершенно неправильное слово, поскольку оно подразумевает строковый литерал.)
Когда я пытаюсь прочитать файл в python, я сталкиваюсь со всевозможными трудностями кодирования (потому что первый байт, 15, является непечатаемым символом и т. Д.)
Например:
>>> f = open('pi100m.hexbin.000', 'rb')
>>> contents = f.read()
>>> f.close()
>>> snippet = contents[:50]
>>> snippet
'x14x15x92e5x89y28Famp;C82yP(x84x19qi9x93ux10X x97IDY#x07x81dx06(bx08x99x86(x03H%4!x17x06y'
>>> # if I 'print snippet', I get those question marks in triangles
>>> # for the nonprinting characters, they do not reproduce
>>> # in stackoverflow
Я перепробовал множество статей StackOverflow и справочных документов Python о кодировании, но у меня такое чувство, что я упускаю что-то очень простое.
Комментарии:
1. может
''.join([str(ord(x)) for x in snippet])
быть?2. @JoranBeasley, вывод этого выражения: «202114610153137121505670386756501218040132 …» По крайней мере, это выглядит намного менее бессмысленно, чем все, что я получил на сегодняшний день!
3. извините, мой плохой `’.join([hex(ord (x))[2:] для x в фрагменте])
Ответ №1:
Кодируйте в шестнадцатеричном формате, тогда у вас, по крайней мере, есть строковое представление:
integer_string = contents.encode('hex')
ДЕМОНСТРАЦИЯ:
>>> snippet = 'x14x15x92e5x89y28Famp;C82yP(x84x19qi9x93ux10X x97IDY#x07x81dx06(bx08x99x86(x03H%4!x17x06y'
>>> snippet.encode('hex')
'1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679'
По сути, это делает то, что делает ваш шестнадцатеричный редактор, представляет байты в виде шестнадцатеричных символов.
Комментарии:
1. Как я и подозревал, мне не хватало чего-то чертовски базового. Я не понял, что можно использовать «шестнадцатеричный» для и кодировать аргумент … не знаю, как я пропустил это в документах. Спасибо, добрый сэр!
Ответ №2:
snippet = 'x14x15x92e5x89y28Famp;C82yP(x84x19qi9x93ux10X x97IDY#x07x81dx06(bx08x99x86(x03H%4!x17x06y'
''.join([str(ord(x)/16) str(ord(x)%16) for x in snippet])
.
'1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679'