Tengo un proyecto en el que me dan un archivo y necesito extraer las cadenas del archivo. Básicamente, piense en el comando "strings" en Linux, pero estoy haciendo esto en Python. La siguiente condición es que el archivo se me proporcione como una secuencia (por ejemplo, cadena), por lo que la respuesta obvia de usar una de las funciones de subproceso para ejecutar cadenas tampoco es una opción.extraer cadenas de un archivo binario en python
de escribir este código:
def isStringChar(ch):
if ord(ch) >= ord('a') and ord(ch) <= ord('z'): return True
if ord(ch) >= ord('A') and ord(ch) <= ord('Z'): return True
if ord(ch) >= ord('0') and ord(ch) <= ord('9'): return True
if ch in ['/', '-', ':', '.', ',', '_', '$', '%', '\'', '(', ')', '[', ']', '<', '>', ' ']: return True
# default out
return False
def process(stream):
dwStreamLen = len(stream)
if dwStreamLen < 4: return None
dwIndex = 0;
strString = ''
for ch in stream:
if isStringChar(ch) == False:
if len(strString) > 4:
#print strString
strString = ''
else:
strString += ch
Esta técnica funciona, pero es lento camino. Por ejemplo, pude usar el comando de cadenas en un ejecutable de 500 Mega y produjo 300k de cadenas en menos de 1 segundo. Ejecuté el mismo archivo a través del código anterior y me llevó 16 minutos.
¿Hay una biblioteca por ahí que me permita hacer esto sin la carga de la latencia de Python?
Gracias!
Si puede leer C, [el código fuente de las cadenas GNU] (http://sourceware.org /cgi-bin/cvsweb.cgi/src/binutils/strings.c?rev=1.48&content-type=text/x-cvsweb-markup&cvsroot=src) podría ser útil. Son solo unos cientos de líneas, así que no es tan malo. –