Python: просмотр всех файлов в Hex - PullRequest
0 голосов
/ 24 мая 2010

Я пишу скрипт на python, который просматривает общие компьютерные файлы и проверяет их на наличие похожих байтов, слов, двойных слов. Хотя мне нужно / я хочу видеть файлы в шестнадцатеричном формате, я не могу заставить Python открыть простой файл в Python. Я пробовал codecs.open с шестнадцатеричной кодировкой в ​​качестве кодировки, но когда я оперирую дескриптором файла, он всегда выплевывает

      File "main.py", line 41, in <module>
    main()
  File "main.py", line 38, in main
    process_file(sys.argv[1])
  File "main.py", line 27, in process_file
    seeker(line.rstrip("\n"))
  File "main.py", line 15, in seeker
    for unit in f.read(2):
  File "/usr/lib/python2.6/codecs.py", line 666, in read
    return self.reader.read(size)
  File "/usr/lib/python2.6/codecs.py", line 472, in read
    newchars, decodedbytes = self.decode(data, self.errors)
  File "/usr/lib/python2.6/encodings/hex_codec.py", line 50, in decode
    return hex_decode(input,errors)
  File "/usr/lib/python2.6/encodings/hex_codec.py", line 42, in hex_decode
    output = binascii.a2b_hex(input)
TypeError: Non-hexadecimal digit found





def seeker(_file):
 f = codecs.open(_file, "rb", "hex")
 for LINE in f.read():
      print LINE
 f.close()

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

Нет, это не домашняя работа.

Ответы [ 3 ]

4 голосов
/ 24 мая 2010

codecs.open(_file, "rb", "hex") пытается декодировать содержимое файла как шестнадцатеричное, поэтому оно не работает на вас.

Учитывая вашу другую цель «слово за раз» (я предполагаю, что вы имеете в виду «компьютерное слово», то есть 32 бита?), Вам лучше будет инкапсулировать открытый файл в собственный класс. E.g.:

class HexFile(object):
    def __init__(self, fp, wordsize=4):
        self.fp = fp
        self.ws = wordsize
    def __iter__(self):
        while True:
            data = self.fp.read(self.ws)
            if not data: break
            yield data.encode('hex')

плюс любые другие полезные методы, которые вы, конечно, найдете полезными.

1 голос
/ 17 августа 2011

если это будет более понятно ...: def hexfile (file_path): Fp = открыта (путь_к_файл) пока верно: data = fp.read (4) если нет данных: перерыв напечатать data.encode ('hex')

file_path - это что-то вроде "C: /somedir/filename.ext" Это хороший метод, кстати, он будет хорошо работать для меня. :)

1 голос
/ 24 мая 2010

Вы можете прочитать установленное количество байтов, передав целочисленный аргумент read:

32bits = file.read(4)

Вы можете искать позицию в файле, используя seek:

file.seek(100) # Seeks to byte 100
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...