Преобразование файла .raw в шестнадцатеричный формат

У меня есть файл изображения .raw, и я хотел бы использовать python3 для чтения всех данных из файла и печати шестнадцатеричного дампа этого изображения.

Если возможно, я бы хотел, чтобы он запускался в окне терминала.

Это код, который я нашел и адаптировал до сих пор:

import sys

src = sys.argv[1]


def hexdump( src, length=16, sep='.' ):
result = [];

# Python3 support
    try:
        xrange(0,1);
    except NameError:
        xrange = range;

    for i in xrange(0, len(src), length):
        subSrc = src[i:i+length];
        hexa = '';
        isMiddle = False;
        for h in xrange(0,len(subSrc)):
            if h == length/2:
                hexa += ' ';
            h = subSrc[h];
            if not isinstance(h, int):
                h = ord(h);
            h = hex(h).replace('0x','');
            if len(h) == 1:
                h = '0'+h;
            hexa += h+' ';
        hexa = hexa.strip(' ');
        text = '';
        for c in subSrc:
            if not isinstance(c, int):
                c = ord(c);
            if 0x20 <= c < 0x7F:
                text += chr(c);
            else:
                text += sep;
        result.append(('%08X:  %-'+str(length*(2+1)+1)+'s  |%s|') % (i, hexa, text));

    return '\n'.join(result);

if __name__ == "__main__":
    print(hexdump(src, length=16, sep='.'))

Я использовал команду в терминале:

python3 nameoffile.py nameofrawfile.raw

и это просто дает мне шестнадцатеричные значения имени необработанного файла. Я бы хотел, чтобы он читал необработанный файл, а затем выдавал все данные из него в шестнадцатеричном формате.

Спасибо.

РЕДАКТИРОВАТЬ: я хотел бы использовать python, поскольку после того, как файл представлен в шестнадцатеричных значениях, я хотел бы выполнить дальнейшую обработку с помощью python.


person Community    schedule 29.12.2014    source источник
comment
Итак, на какой части вы застряли и что вы пробовали до сих пор?   -  person cdarke    schedule 29.12.2014
comment
Почему Питон? Почему бы просто не использовать готовую программу, например hexdump?   -  person Lee Daniel Crocker    schedule 29.12.2014
comment
Привет, ребята, спасибо за ваши комментарии, я отредактирую свой пост, чтобы показать, что я уже пробовал.   -  person    schedule 29.12.2014


Ответы (2)


Проблема в том, что вы передаете имя файла в hexdump(), который обрабатывает его как данные. Следующее исправляет это и применяет другие относительно незначительные исправления к вашему коду (и, похоже, работает в моем ограниченном тестировании):

try:
    xrange
except NameError:  # Python3
    xrange = range

def hexdump(filename, length=16, sep='.'):
    result = []

    with open(filename, 'rb') as file:
        src = file.read()  # Read whole file into memory

    for i in xrange(0, len(src), length):
        subSrc = src[i:i+length]
        hexa = ''
        isMiddle = False;
        for h in xrange(0,len(subSrc)):
            if h == length/2:
                hexa += ' '
            h = subSrc[h]
            if not isinstance(h, int):
                h = ord(h)
            h = hex(h).replace('0x','')
            if len(h) == 1:
                h = '0'+h;
            hexa += h+' '
        hexa = hexa.strip(' ')
        text = ''
        for c in subSrc:
            if not isinstance(c, int):
                c = ord(c)
            if 0x20 <= c < 0x7F:
                text += chr(c)
            else:
                text += sep;
        result.append(('%08X:  %-'+str(length*(2+1)+1)+'s  |%s|') %
                      (i, hexa, text))

    return '\n'.join(result)

if __name__ == "__main__":
    import sys

    filename = sys.argv[1]
    print(hexdump(filename, length=16, sep='.'))
person martineau    schedule 29.12.2014
comment
Привет, спасибо за ваш ответ, кажется, он имеет больше смысла. Однако я получаю эту ошибку: Traceback (последний последний вызов): файл HexConv2.py, строка 44, в ‹module› print(hexdump(filename, length=16, sep='.')) File HexConv2.py, строка 10 , in hexdump src = file.read() # Считать файл целиком в память OSError: [Errno 22] Неверный аргумент. Это связано с размером файла .raw? Это около 4 ГБ - person ; 29.12.2014
comment
Сообщение об ошибке не имеет смысла, потому что аргумент не передается. Мне не удалось воспроизвести проблему с использованием Python 2.7.9 и 3.4.2 — похоже, он работал без каких-либо ошибок. - person martineau; 29.12.2014
comment
P.S. В отступе в начале hexdump() в коде моего исходного поста был один символ табуляции, который я удалил при редактировании. Однако это дало бы вам другое сообщение об ошибке. - person martineau; 29.12.2014
comment
Я только что заметил часть о том, что файл имеет размер 4 ГБ в конце вашего исходного комментария... да, это может быть проблемой, если вы используете 32-битный Python и/или ОС. Помимо чтения всего файла в память, возвращаемая строка hexdump() будет в несколько раз больше. Попробуйте использовать его для файла меньшего размера и посмотрите, что произойдет. Чтобы заставить его работать с большими файлами, вам нужно изменить свою функцию, чтобы читать, обрабатывать и возвращать результаты фрагментами управляемого размера. - person martineau; 29.12.2014

Один лайнер:

$ python -c \
"import codecs; print(codecs.encode(open('file.raw', 'rb').read(), 'hex').decode())" 
person Paulo Scardine    schedule 29.12.2014
comment
Привет, извините, я должен был указать, я бы хотел, чтобы это было в коде Python, так как я хотел бы выполнить дальнейшую обработку файла в Python. Спасибо - person ; 29.12.2014
comment
Выражение внутри print(...) возвращает нужное вам значение (в виде строки), не так ли? - person Paulo Scardine; 29.12.2014