将.raw文件转换为十六进制

时间:2014-12-29 17:04:40

标签: python hexdump

我有.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对其进行进一步处理。

2 个答案:

答案 0 :(得分:1)

一衬垫:

$ python -c \
"import codecs; print(codecs.encode(open('file.raw', 'rb').read(), 'hex').decode())" 

答案 1 :(得分:0)

问题是您将文件的名称传递给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='.'))