Python:如何比较两个二进制文件?

2024-05-28 20:04:02 发布

您现在位置:Python中文网/ 问答频道 /正文

在python中,我需要打印两个二进制文件的diff。我在看的difflib.Differ做了很多。

但是,different假定文本行数,因此输出不列出字节索引和十六进制值差异。

我需要的是输出有哪些字节不同,字节如何不同,两个字节的实际十六进制值。

在Python中,如何比较两个二进制文件(输出:字节差异索引,两个字节的十六进制值)?

我在做这样的事情:

# /usr/bin/env python2
import difflib
x = open('/path/to/file1', 'r').read()
y = open('/path/to/file2', 'r').read()
print '\n'.join(difflib.Differ().compare(x, y))

但这并没有输出字节索引的不同之处。它不会打印十六进制值。


Tags: 文件topath文本read字节usr二进制
2条回答

difflib比较时,它会将每个字符放入前面带有+或-的数组中。下面比较x和y,然后查看输出:

   d = difflib.Differ()
   e = d.compare(x,y)        #set the compare output to a variable

   for i in range(0,len(e)):
       if i.startswith("-"):         #if that char start with "-" is not a match
           print(i + "index is different")

字符将以“-”开头,但不匹配+“表示它们匹配。

shell命令cmp已经完全满足了我的需要/需要。在Python中重新设计这个功能将需要更多的努力/代码/时间。。。所以我刚从Python调用了命令:

#!/usr/bin/env python2
import commands
import numpy as np
def run_cmp(filename1, filename2):
    cmd = 'cmp --verbose %s %s'%(filename1, filename2)
    status, output = commands.getstatusoutput(cmd) # python3 deprecated `commands` module FYI
    status = status if status < 255 else status%255
    if status > 1:
        raise RuntimeError('cmp returned with error (exitcode=%s, '
                'cmd=\"%s\", output=\n\"%s\n\")'%(status, cmd, output))
    elif status == 1:
        is_different = True
    elif status == 0:
        is_different = False
    else:
        raise RuntimeError('invalid exitcode detected')
    return is_different, output
if __name__ == '__main__':
    # create two binary files with different values
    # file 1
    tmp1 = np.arange(10, dtype=np.uint8)
    tmp1.tofile('tmp1')
    # file 2
    tmp2 = np.arange(10, dtype=np.uint8)
    tmp2[5] = 0xFF
    tmp2.tofile('tmp2')
    # compare using the shell command 'cmp'
    is_different, output = run_cmp(filename1='tmp1', filename2='tmp2')
    print 'is_different=%s, output=\n\"\n%s\n\"'%(is_different, output)

相关问题 更多 >

    热门问题