una - mclibre funciones python
calcular crc de archivo en python (6)
Combine los 2 códigos anteriores como se muestra a continuación:
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()
Quiero calcular el CRC del archivo y obtener una salida como: E45A12AC
. Aquí está mi código:
#!/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)
Esto calcula el CRC para cada línea, pero su salida (por ejemplo, -1767935985
) no es lo que quiero.
Hashlib funciona de la manera que quiero, pero calcula el md5:
import hashlib
m = hashlib.md5()
for line in open(''data.txt'', ''rb''):
m.update(line)
print m.hexdigest()
¿Es posible obtener algo similar usando zlib.crc32
?
Para mostrar los 32 bits más bajos de cualquier número entero como 8 dígitos hexadecimales, sin signo, puede "enmascarar" el valor por bit y con una máscara hecha de 32 bits, todos con el valor 1, y luego aplicar el formato. Es decir:
>>> x = -1767935985
>>> format(x & 0xFFFFFFFF, ''08x'')
''969f700f''
Es bastante irrelevante si el número entero que está formateando proviene de zlib.crc32
o de cualquier otro cálculo.
Puedes usar base64 para salir como [ERD45FTR]. Y zlib.crc32 proporciona opciones de actualización.
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)))import os, sys
import zlib
import base64
Un código un poco más compacto y optimizado.
def crc(fileName):
prev = 0
for eachLine in open(fileName,"rb"):
prev = zlib.crc32(eachLine, prev)
return "%X"%(prev & 0xFFFFFFFF)
PS2: El PS antiguo está en desuso, por lo que se eliminó, debido a la sugerencia del comentario. Gracias. No entiendo cómo extrañé esto, pero fue realmente bueno.
interfaz compatible con hashlib para el soporte 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'')
solución:
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)
no sé realmente por lo que es (excludeLine = "", includeLine = "") ...