在python中我需要打印两个二进制文件的diff。我看着difflib.Differ
做了很多事。
然而,不同的是假定文本行,因此输出不会列出字节索引和十六进制值差异。
我需要的是具有不同字节的输出,字节如何不同,两个字节的实际十六进制值。
在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))
但是这并没有输出差异所在的字节索引。并且它不会打印十六进制值。
答案 0 :(得分:0)
当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")
字符将以不匹配的“-”开头。 “ +”表示它们匹配。
答案 1 :(得分:-2)
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)