valor una teclado mclibre leer lectura funciones con capturar cadena python hash crc

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.

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)))


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 = "") ...