我应该使用struct比较字节吗?

时间:2010-08-14 17:50:16

标签: python file comparison byte

我正在尝试比较两个文件中的数据,并检索差异所在位置的偏移列表。 我尝试了一些文本文件,它工作得很好.. 但是在非文本文件(仍然包含ascii文本)上,我称之为二进制数据文件。 (可执行文件,等等......)

似乎认为某些字节是相同的,即使我在十六进制编辑器中查看它们时,它们显然不是。我尝试打印出它认为相同的二进制数据,并且我得到了应该打印的空白行。 因此,我认为这是问题的根源。

那么比较可能是二进制文件还是包含ascii文本的数据字节的最佳方法是什么?我认为使用struct模块是一个起点...

如下所示,我将字节与==运算符

进行比较

以下是代码:

import os
import math


#file1 = 'file1.txt'
#file2 = 'file2.txt'
file1 = 'file1.exe'
file2 = 'file2.exe'
file1size = os.path.getsize(file1)
file2size = os.path.getsize(file2)
a = file1size - file2size
end = file1size  #if they are both same size
if a > 0:
    #file 2 is smallest
    end = file2size
    big = file1size

elif a < 0:
    #file 1 is smallest
    end = file1size
    big = file2size


f1 = open(file1, 'rb')
f2 = open(file2, 'rb')



readSize = 500
r = readSize
off = 0
data = []
looking = False
d = open('data.txt', 'w')


while off < end:
    f1.seek(off)
    f2.seek(off)
    b1, b2 = f1.read(r), f2.read(r)
    same = b1 == b2
    print ''
    if same:
        print 'Same at: '+str(off)
        print 'readSize: '+str(r)
        print b1
        print b2
        print ''
        #save offsets of the section of "different" bytes
        #data.append([diffOff, diffOff+off-1])  #[begin diff off, end diff off]
        if looking:
            d.write(str(diffOff)+" => "+str(diffOff+off-2)+"\n")
            looking = False
            r = readSize
            off = off + 1
        else:
            off = off + r

    else:
        if r == 1:
            looking = True
            diffOff = off
            off = off + 1 #continue reading 1 at a time, until u find a same reading
        r = 1  #it will shoot back to the last off, since we didn't increment it here



d.close()
f1.close()
f2.close()          

#add the diff ending portion to diff data offs, if 1 file is longer than the other
a = int(math.fabs(a))  #get abs val of diff
if a:
    data.append([big-a, big-1])


print data

2 个答案:

答案 0 :(得分:4)

您是否尝试过difflibfilecmp个模块?

  

这个模块提供了类和   比较序列的功能。它   可用于例如比较   文件,并可以产生差异   各种格式的信息,   包括HTML和上下文和统一   diff文件。用于比较目录和   文件,另请参阅filecmp模块。

     

filecmp模块定义了函数   比较文件和目录,用   各种可选的时间/正确性   权衡。有关比较文件,请参阅   还有difflib模块

答案 1 :(得分:0)

您可能遇到编码/解码问题。有人可能会建议一个更好的解决方案,但您可以尝试将文件读入bytearray,这样您就可以读取原始字节而不是解码字符:

这是一个粗略的例子:

$ od -Ax -tx1 /tmp/aa
000000 e0 b2 aa 0a
$ od -Ax -tx1 /tmp/bb
000000 e0 b2 bb 0a

$ cat /tmp/diff.py 
a = bytearray(open('/tmp/aa', 'rb').read())
b = bytearray(open('/tmp/bb', 'rb').read())
print "%02x, %02x" % (a[2], a[3])
print "%02x, %02x" % (b[2], b[3])

$ python /tmp/diff.py 
aa, 0a
bb, 0a