【问题标题】:Converting .raw file into Hex将 .raw 文件转换为十六进制
【发布时间】:2014-12-29 17:04:40
【问题描述】:

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

【问题讨论】:

  • 那么,你坚持哪一部分,到目前为止你尝试了什么?
  • 为什么选择 Python?为什么不直接使用像 hexdump 这样的现成程序?
  • 大家好,感谢您的 cmets,我将编辑我的帖子以展示我到目前为止所做的尝试。

标签: python hexdump


【解决方案1】:

单线:

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

【讨论】:

  • 您好,对不起,我应该指定,我想在 python 代码中使用它,因为我想在 python 中对文件进行进一步处理。谢谢
  • print(...) 中的表达式返回你想要的值(作为字符串),不是吗?
【解决方案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='.'))

【讨论】:

  • 您好,感谢您的回复,这似乎更有意义。但是我收到了这个错误: Traceback (last recent call last): File "HexConv2.py", line 44, in print(hexdump(filename, length=16, sep='.')) File "HexConv2.py ", line 10, in hexdump src = file.read() # 将整个文件读入内存 OSError: [Errno 22] Invalid argument.这是由于 .raw 文件的大小造成的吗?大约 4GB
  • 错误消息没有意义,因为没有传递任何参数。我无法重现使用 Python 2.7.9 和 3.4.2 的问题——看起来它可以正常工作,没有显示任何错误。
  • P.S.在我最初的帖子中的代码中,hexdump() 开头附近的缩进中有一个制表符,我已在编辑中将其删除。但是,这会给您带来不同类型的错误消息。
  • 我刚刚注意到原始评论末尾关于文件为 4GB 的部分......是的,如果您使用的是 32 位 Python 和/或操作系统,这可能是一个问题。除了将整个文件读入内存之外,hexdump() 返回的字符串将比这大几倍。 尝试在较小的文件上使用它,看看会发生什么。要使其适用于大文件,您需要修改函数以可管理大小的块读取、处理和返回结果。跨度>
猜你喜欢
  • 1970-01-01
  • 2014-11-11
  • 2011-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多