calculer crc de fichier en python
je veux calculer le CRC de fichier et obtenir une sortie de la forme: E45A12AC
. Voici mon code:
#!/usr/bin/env python
import os, sys
import zlib
def crc(fileName):
fd = open(fileName,"rb")
content = fd.readlines()
fd.close()
for eachLine in content:
zlib.crc32(eachLine)
for eachFile in sys.argv[1:]:
crc(eachFile)
cela calcule le CRC pour chaque ligne, mais sa sortie (par exemple -1767935985
) n'est pas ce que je veux.
Hashlib fonctionne comme je veux, mais il calcule le md5:
import hashlib
m = hashlib.md5()
for line in open('data.txt', 'rb'):
m.update(line)
print m.hexdigest()
Est-il possible d'obtenir quelque chose de similaire à l'aide de <!--4?
6 réponses
un peu plus de code compact et optimisé
def crc(fileName):
prev = 0
for eachLine in open(fileName,"rb"):
prev = zlib.crc32(eachLine, prev)
return "%X"%(prev & 0xFFFFFFFF)
PS2: L'Ancien PS est déprécié - donc supprimé -, en raison de la suggestion dans le commentaire. Remercier. Je ne comprends pas comment j'ai raté ça, mais c'était vraiment bon.
hashlib - interface compatible pour le support CRC-32:
import zlib class crc32(object): name = 'crc32' digest_size = 4 block_size = 1 def __init__(self, arg=''): self.__digest = 0 self.update(arg) def copy(self): copy = super(self.__class__, self).__new__(self.__class__) copy.__digest = self.__digest return copy def digest(self): return self.__digest def hexdigest(self): return '{:08x}'.format(self.__digest) def update(self, arg): self.__digest = zlib.crc32(arg, self.__digest) & 0xffffffff # Now you can define hashlib.crc32 = crc32 import hashlib hashlib.crc32 = crc32 # Python > 2.7: hashlib.algorithms += ('crc32',) # Python > 3.2: hashlib.algorithms_available.add('crc32')
pour afficher les 32 bits les plus bas de n'importe quel entier comme 8 chiffres hexadécimaux, sans signe, vous pouvez "masquer" la valeur par bit-et'ing il avec un masque fait de 32 bits tout à la valeur 1, puis appliquer le formatage. I. e.:
>>> x = -1767935985
>>> format(x & 0xFFFFFFFF, '08x')
'969f700f'
peu importe que le nombre entier que vous formatez Vienne de zlib.crc32
ou tout autre calcul.
fusionner les 2 codes ci-dessus comme suit:
try:
fd = open(decompressedFile,"rb")
except IOError:
logging.error("Unable to open the file in readmode:" + decompressedFile)
return 4
eachLine = fd.readline()
prev = 0
while eachLine:
prev = zlib.crc32(eachLine, prev)
eachLine = fd.readline()
fd.close()
Vous pouvez utiliser base64 pour sortir comme [ERD45FTR]. Et zlib.crc32 fournit des options de mise à jour.
import os, sys
import zlib
import base64
def crc(fileName):
fd = open(fileName,"rb")
content = fd.readlines()
fd.close()
prev = None
for eachLine in content:
if not prev:
prev = zlib.crc32(eachLine)
else:
prev = zlib.crc32(eachLine, prev)
return prev
for eachFile in sys.argv[1:]:
print base64.b64encode(str(crc(eachFile)))
solution:
import os, sys
import zlib
def crc(fileName, excludeLine="", includeLine=""):
try:
fd = open(fileName,"rb")
except IOError:
print "Unable to open the file in readmode:", filename
return
eachLine = fd.readline()
prev = None
while eachLine:
if excludeLine and eachLine.startswith(excludeLine):
continue
if not prev:
prev = zlib.crc32(eachLine)
else:
prev = zlib.crc32(eachLine, prev)
eachLine = fd.readline()
fd.close()
return format(prev & 0xFFFFFFFF, '08x') #returns 8 digits crc
for eachFile in sys.argv[1:]:
print crc(eachFile)
ne pas vraiment savoir ce qui est (excludeLine="", includeLine="")...