Ich schreibe zzt ein Pythonskript in dem ich Binärdaten in Motorola-SRec format umwandle.
Dieses Format hat am Ende jeder Zeile eine Checksumme.
Diese setzt sich wie folgt zusammen:
- die Quersumme aller Bytewerte,
- von dieser Summe das einer Komplement bilden
- in diesem Wert steht das letzte byte für die gefragte Checksumme
ich habe diese Berechnung wie folgt umgesetzt:
Code: Alles auswählen
Beispiel für eine typische image_line
'S21404000018F09FE518F09FE518F09FE518F09FE5'
def __appendChecksum(self,image_line):
bytesum = 0
# Durchläuft den String in 2er Schritten um jeweils das nächste byte zu addieren.
for step in range(2, len(image_line), 2):
bytesum += int(image_line[step:step+2], 16)
# Diese Summe wird invertiert und wir filtern nur das letzte byte heraus
checksum_int = ~bytesum & 0x000000FF
# Abschliessend geben wir aus dem Hexstring beiden letzten chars zurück.
# Bsp: '0x3A' -> '3A'
return image_line + hex(checksum_int)[2:].zfill(2)
Bei dem derzeitigen "Algorithmus" komme ich auf Berechnungszeiten, nur für diesen Block,
von über einer Minute. Das ist leider zu lange und ich habe noch keine andere Möglichkeit gefunden.
Fragen:
Gibt es in Python vielleicht fertige effiziente Funktionen zur Quersummenberechnung, zB einer aus Liste oder ähnlichem?
Oder hat einer eine Idee wie man diese Berechnung schneller machen könnte?
Ich hatte auch schon den Versuch gestartet, anstatt für jede Zeile die Funktion aufzurufen, die komplette Liste zu übergeben.
Aber das hat mir gerade mal (wenn überhaupt) 4 Sekunden unterschied gebracht.
Daran scheints also nicht zu liegen. Zudem brauche ich die Checksumberechnung noch vereinzelt in anderen Fällen und dann nur für eine Zeile. Deshalb bin ich "erstmal" bei der Struktur geblieben.