3 Stimmen

Sollte ich Bytes mit struct vergleichen?

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

4voto

Jungle Hunter Punkte 7159

Haben Sie versucht difflib y filecmp Module?

Dieses Modul bietet Klassen und Funktionen für den Vergleich von Sequenzen. Es kann zum Beispiel für den Vergleich von Dateien verwendet werden und kann Differenz Informationen in verschiedenen Formaten ausgeben, einschließlich HTML und Kontext und vereinheitlichte Diffs. Für den Vergleich von Verzeichnissen und Dateien, siehe auch, die filecmp Modul.

Das Modul filecmp definiert Funktionen zum Vergleich von Dateien und Verzeichnissen, mit verschiedenen optionalen Zeit/Richtigkeits Abwägungen. Für den Vergleich von Dateien, siehe auch die difflib Modul

.

0voto

bstpierre Punkte 28260

Wahrscheinlich haben Sie Probleme mit der Kodierung/Dekodierung. Vielleicht schlägt jemand eine bessere Lösung vor, aber Sie könnten versuchen, die Datei in eine bytearray so dass Sie rohe Bytes anstelle von dekodierten Zeichen lesen:

Hier ist ein grobes Beispiel:

$ 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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X