Ich versuche, die Daten in zwei Dateien zu vergleichen und eine Liste von Offsets abzurufen, wo die Unterschiede sind. Ich habe es mit einigen Textdateien versucht und es hat ganz gut funktioniert. Bei Nicht-Text-Dateien (die noch ASCII-Text enthalten) nenne ich sie jedoch Binärdateien. (ausführbare Dateien und so weiter )
Es scheint zu glauben, dass einige Bytes gleich sind, obwohl sie es offensichtlich nicht sind, wenn ich sie im Hex-Editor betrachte. Ich habe versucht, diese Binärdaten, die es für gleich hält, auszudrucken, und ich erhalte Leerzeilen an den Stellen, an denen sie gedruckt werden sollten. Ich denke also, dass dies die Ursache des Problems ist.
Was ist also der beste Weg, um Bytes von Daten zu vergleichen, die sowohl binär sein können als auch ASCII-Text enthalten? Ich dachte, mit dem struct-Modul durch einen Ausgangspunkt sein...
Wie Sie unten sehen können, vergleiche ich die Bytes mit dem == Operator
Hier ist der Code:
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