J'ai essayé de comprendre les calculs de CRC32 sans grand succès, les valeurs que je semble obtenir ne correspondent pas à ce que je devrais obtenir. Je suis conscient que Python a des bibliothèques capables de générer ces checksums (à savoir zlib et binascii) mais je n'ai pas le luxe de pouvoir les utiliser car la fonctionnalité CRC n'existe pas sur le micropython.Calcul CRC32 en Python sans utiliser les bibliothèques
Jusqu'à présent, j'ai le code suivant:
import binascii
import zlib
from array import array
poly = 0xEDB88320
table = array('L')
for byte in range(256):
crc = 0
for bit in range(8):
if (byte^crc) & 1:
crc = (crc >> 1)^poly
else:
crc >>= 1
byte >>= 1
table.append(crc)
def crc32(string):
value = 0xffffffffL
for ch in string:
value = table[(ord(ch)^value) & 0x000000ffL]^(value >> 8)
return value
teststring = "test"
print "binascii calc: 0x%08x" % (binascii.crc32(teststring) & 0xffffffff)
print "zlib calc: 0x%08x" % (zlib.crc32(teststring) & 0xffffffff)
print "my calc: 0x%08x" % (crc32(teststring))
Puis-je obtenir la sortie suivante:
binascii calc: 0xd87f7e0c
zlib calc: 0xd87f7e0c
my calc: 0x2780810c
Les calculs de binascii et zlib d'accord alors que mon seul ne fonctionne pas. Je crois que la table calculée des octets est correcte car je l'ai comparée aux exemples disponibles sur le net. Donc le problème doit être la routine où chaque octet est calculé, est-ce que quelqu'un pourrait me pointer dans la bonne direction?
Merci d'avance!
Vous êtes un dieu merci, merci beaucoup pour votre réponse rapide et la solution! – Cooper
@Cooper Pas de soucis. Je ne suis pas sûr à 100% de mon tweak (en raison du mélange de l'arithmétique avec les opérations au niveau du bit). Il semble que le travail soit fait correctement, mais je m'inquiète un peu de ce que cela donne une mauvaise réponse dans un cas particulier. OTOH, je viens de vérifier qu'il retourne 'ffffffff' lorsqu'il est passé' '\ xff \ xff \ xff \ xff'', donc c'est un bon signe. :) –
@Cooper Après ces tests supplémentaires, ma confiance a augmenté. :) Je serais très surpris si cela retourne le mauvais résultat pour n'importe quelle entrée. –