CRC-CCITT 16-bit-Python-Manuelle Berechnung
Problem
Ich Schreibe den code für ein embedded-Gerät. Viele Lösungen gibt es für die CRC-CCITT 16-bit-Berechnungen erfordern Bibliotheken.
Gegeben, dass die Verwendung von Bibliotheken ist nahezu unmöglich und ein Abfluss auf Ihre Ressourcen, die eine Funktion erforderlich ist.
Mögliche Lösung
Den folgenden CRC-Berechnung wurde online gefunden. Allerdings, die Umsetzung ist falsch.
http://bytes.com/topic/python/insights/887357-python-check-crc-frame-crc-16-ccitt
def checkCRC(message):
#CRC-16-CITT poly, the CRC sheme used by ymodem protocol
poly = 0x11021
#16bit operation register, initialized to zeros
reg = 0xFFFF
#pad the end of the message with the size of the poly
message += '\x00\x00'
#for each bit in the message
for byte in message:
mask = 0x80
while(mask > 0):
#left shift by one
reg<<=1
#input the next bit from the message into the right hand side of the op reg
if ord(byte) & mask:
reg += 1
mask>>=1
#if a one popped out the left of the reg, xor reg w/poly
if reg > 0xffff:
#eliminate any one that popped out the left
reg &= 0xffff
#xor with the poly, this is the remainder
reg ^= poly
return reg
Bestehende Online-Lösung
Den folgenden link, berechnet ein 16-bit-CRC korrekt.
http://www.lammertbies.nl/comm/info/crc-calculation.html#intr
In der Folge unter "CRC-CCITT (XModem)" ist die korrekte CRC.
Spezifikation
Glaube ich die "CRC-CCITT (XModem)" Berechnung in die bestehende online-Lösung verwendet ein Polynom 0x1021
.
Frage
Wenn jemand schreiben könnte, eine neue Funktion oder eine Richtung zu lösen, die checkCRC
- Funktion, um die geforderte Spezifikation. Bitte beachten Sie, dass die Nutzung von Bibliotheken oder jede import
's nicht helfen würde.
Hallo Antti, Suche für eine Funktion-basierte Lösung, die keine Bibliotheken. Dank
Sie können kopieren Sie die Klassen aus GitHub, Sie sind Reine python.
InformationsquelleAutor Alex Stewart | 2014-08-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist ein python-port aus der C-Bibliothek von http://www.lammertbies.nl/comm/info/crc-calculation.html für CRC-CCITT XMODEM
Diese Bibliothek ist interessant für echte Anwendungsfälle, da es pre-berechnet eine Tabelle von crc für mehr Geschwindigkeit.
Nutzung (mit einem string oder eine Liste von bytes) :
Gibt der test :
'0x31c3'
Ihre vorgeschlagenen
checkCRC
routine CRC-CCITT-Variante "1D0F', wenn Sie ersetzenpoly = 0x11021
mitpoly = 0x1021
am Anfang.crc_string = "0A0A0A0A0A0A0A"
Sie zuerst konvertieren den string in eine Liste von bytes, und rufen Sie dann crcb :
crcb(*[ int(crc_string[i:i+2], 16) for i in range(0, len(crc_string), 2)])
- fürcrc_string = "0A0A0A0A0A0A0A"
es gibt53769
=0xd209
Danke Serge, das funktionierte genau!
Ich werde sehen, ob diese Zeilen mit boost crc_ccitt_type. Die
CRC-CCITT (0xFFFF)
bietet Sie sieht aus wietypedef crc_optimal<16, 0x1021, 0xFFFF, 0, false, false> crc_ccitt_type
; ich kann sehen, dass die InitRem parameter (0xFFFF) entspricht, aber ich brauche, um zu Graben in für die anderen Parameter.Die Webseite scheint zu Stimmen mit der boost-Implementierung für eine Handvoll von Kontrollen. Gibt es einen schnellen update auf Ihren port zu ändern, CRC-CCITT (XMODEM) CRC-CCITT (0xFFFF). Ich studieren werde, die Quelle, aber von den Jungs readme lib_crc.txt es sieht aus wie CRC-CCITT XModem, 0xFFFF, und 0x1D0F alle unterscheiden sich durch die Start-Wert, die ich vermute, ist Ihr
PRESET
variable.InformationsquelleAutor Serge Ballesta
Hier ist eine C-version, die Sie übersetzen zu Python:
crc
ist auf null initialisiert.unsigned
es ist.Hallo Markus, ich hatte einen Riss an der Konvertierung in Python, war aber weitgehend erfolglos. Danke für Eure Hilfe!
href="https://pypi.org/project/crccheck/" >pypi.org/project/crccheck implementiert diese, und mehr, in Python.
Crc16
baseclass folgt dicht Daneben ist die Umsetzung hier, mit konfigurierbaren Reflexion und Polynom (sowie konfigurierbare init-und xor-Ausgang, wie angedeutet durch den Kommentar im code hier, für weitere CRC16-Varianten).InformationsquelleAutor Mark Adler
Hier ist eine Funktion, die ich benutze:
Hi, um ehrlich zu sein, fand ich diese magic-code in ASM. Nur ich schrieb es in python vor einiger Zeit.
Ich bin nicht in der Lage, um das gleiche Ergebnis von diesem code bekommen wie ich von Serge Ballesta Antwort.
Welche Parameter Sie übergeben der Funktion?
Dies wäre hilfreich, wenn gab es eine Erklärung, wie es zu benutzen. In seiner jetzigen form, es ist überhaupt nicht hilfreich.
InformationsquelleAutor Luciano Barcaro
Die ursprüngliche Funktion
checkCRC
können, können auch "CRC-CCITT (XModem)".Nur set:
Statt
InformationsquelleAutor Arik Yavilevich
Entwickelt ich ein kleines python-Modul zum generieren von crc.
Give it a shot, und überprüfen Sie den Quellcode, kann es helfen!
https://github.com/killercode/PythonCRC
Für das, was Sie wollen, Sie müssen nur den folgenden code verwenden
Hoffe es hilft 🙂
InformationsquelleAutor Killercode