Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: sr_corsario en 27 Septiembre 2009, 18:34 pm



Título: [Solucionado]¿Como cortar un cacho del final de un archivo?
Publicado por: sr_corsario en 27 Septiembre 2009, 18:34 pm
Buenas.

He estado mirando el foro para ver si había algo parecido a mi problemilla pero no lo he encontrado...

El hilo que mas se parecía es: http://foro.elhacker.net/scripting/ayuda_cortar_una_parte_de_un_txt-t252780.0.html%3Bmsg1224379 (http://foro.elhacker.net/scripting/ayuda_cortar_una_parte_de_un_txt-t252780.0.html%3Bmsg1224379) que es "cortar una parte de un txt."


Mi caso es el siguiente:

-Bastantes archivos "file.bin" (por ponerle un nombre, este siempre es el mismo) en diferentes carpetas

-Cada archivo tiene un tamaño diferente

-Es un "Bin"

-Los últimos 131.072bytes de cada archivo son idénticos.

Lo que me gustaría es un bat que me cortase esos últimos bytes del archivo.

He estado buscando programas que cortan archivos... pero como mucho he conseguido el fcut que si que me lo hace, pero le tengo que dar manualmente la posición donde corta y como cada vez es diferente ...


Gracias
Sr Corsario



Título: Re: [Ayuda] ¿Como cortar un cacho del final de un archivo "Bin"?
Publicado por: leogtz en 27 Septiembre 2009, 18:42 pm
Pues podríamos hacer un script para cortarlo, sabiendo donde hay que cortar.  :-\


Título: Re: [Ayuda] ¿Como cortar un cacho del final de un archivo "Bin"?
Publicado por: sr_corsario en 27 Septiembre 2009, 18:48 pm
Gracias por responder tan rápido.

Supongo que de alguna manera se ha de poder hacer... o buscando la cadena de bytes del inicio del corte (que sería en hex supongo) o no se... , o buscar el tamaño etc etc... nu se...

Edit:Decir que el comando findstr me dice "La linea xxxxx es demasiado larga" supongo que alguna limitación tendrá... o que al ser un bin no lo soporta, ni idea.

Gracias



Título: Re: [Ayuda] ¿Como cortar un cacho del final de un archivo "Bin"?
Publicado por: xassiz_ en 27 Septiembre 2009, 20:33 pm
En que lenguaje? ::)


Título: Re: [Ayuda] ¿Como cortar un cacho del final de un archivo "Bin"?
Publicado por: Darioxhcx en 27 Septiembre 2009, 20:44 pm
En que lenguaje? ::)
en asm 16 bits lo kiere


Título: Re: [Ayuda] ¿Como cortar un cacho del final de un archivo "Bin"?
Publicado por: xassiz_ en 27 Septiembre 2009, 20:50 pm
En que lenguaje? ::)
en asm 16 bits lo kiere

Ah okk! Que pena que no se asm.. pero que lo muevan de Scripting porque aqui puede ser Batch, VBScript, Perl, Python, etc..


Título: Re: [Ayuda] ¿Como cortar un cacho del final de un archivo "Bin"?
Publicado por: sr_corsario en 27 Septiembre 2009, 20:52 pm
En que lenguaje? ::)
en asm 16 bits lo kiere

xD

Mmmmm... en que haga lo que necesito me es indiferente. Mejor si es un script/bat porque de esa manera yo ya podré seguir con otros pasos que necesito hacer.

Muchas gracias por el interés



Título: Re: [Ayuda] ¿Como cortar un cacho del final de un archivo "Bin"?
Publicado por: 43H4FH44H45H4CH49H56H45H en 28 Septiembre 2009, 00:34 am
Pudes hacerlo con python:
Código
  1. os.path.getsize
para obtener el tamaño del archivo y de ahi restar los bytes que quieres sacar, hacer un
Código
  1. read(n bytes)
desde el inicio del archivo hasta el resultado de la resta y escribirlo en otro archivo que seria el nuevo bin y renombrar al original como backup.
En VB6 es igual de sencillo con:
Código
  1. Open archivo For Binary As #numero
  2. Get
  3. Put
  4. LOF(numero)
  5. 'datos como Byte, Long y demas
  6.  
y haces el mismo procedimiento o puedes utilizar otro lenguaje mas rapido como c  o en caso de c++ podrias utilizar:
Código
  1. ios::binary, ios::out, ios::in
Supongo que en Vb Script tb pueda hacerse, pero voz eliges.


Título: Re: [Ayuda] ¿Como cortar un cacho del final de un archivo "Bin"?
Publicado por: sr_corsario en 28 Septiembre 2009, 14:11 pm
Gracias por las respuestas.

Yo no tengo ni idea de programar nada... solo alguna noción básica.

Podría alguien terminarmelo pleaseee  :rolleyes:


Aps otra cosa... igual estaba confundido con lo de la extensión de la archivo. Es bin pero no se como van los datos en el...

Gracias

Edit:Los valores del archivo están en hex... eso supongo que influye en algo sorry


Título: Re: [Ayuda] ¿Como cortar un cacho del final de un archivo "Bin"?
Publicado por: 43H4FH44H45H4CH49H56H45H en 29 Septiembre 2009, 07:45 am
Te puedo dar un poco de ayuda de pasada en python:
Código
  1. import os
  2. def cortar(nomOriginal, nomNuevo, tamArchivo, tamCortar):
  3.    with open(nomOriginal, 'r+b') as file1:
  4.        f1 = file1.read (tamArchivo-tamCortar)
  5.        file1.close()
  6.    with open(nomNuevo, 'w+b') as file2:
  7.        file2.write(f1)
  8.        file2.close()
  9.        print("Cortado Hecho y guardado en: " + nomNuevo)
  10.  
  11. direc = input('Ingrese Directorio: ')
  12. dirList = os.listdir(direc)
  13.  
  14. for fname in dirList:
  15.    if(fname.upper().endswith('.JPG')):
  16.        if(os.path.isfile(direc + fname)== True):
  17.            if(os.path.exists(direc + fname + '.bak')== False):
  18.                print ('Nombre de archivo: '+ fname)
  19.                leno = os.path.getsize(direc + fname)
  20.                print ("inciando cortado en: " + direc + fname)
  21.                os.rename(direc + fname,direc + fname + '.bak')
  22.                cortar(direc + fname + '.bak', direc + fname, leno, 1000)
  23.            else:
  24.                print ('Archivo: ' + direc + fname + ' ya fue cortado')
  25.  

El code es solo un inicio faltan muchas cosas, pero sirve para lo que buscas al iniciar pide el directorio donde buscara los archivos con la extension especificada, en el ejemplo puse *.jpg para que se pueda ver el cambio que realiza, en:
Código
  1. cortar(direc + fname + '.bak', direc + fname, leno, 1000)
el numero 1000 representa cuantos bytes del final de archivo quitara y escribira en un nuevo archivo con el nombre original, antes verifica si se trata de un archivo y si existe o no un archivo *.bak con su nombre, de ser asi no lo procesa porque lo toma como un archivo ya "cortado". Pruebalo en unas imagenes JPG que tengan un tamaño superior al numero que especifiques en "cortar" y veras los cambios al ejecutarlo, luego puedes utilizarlo para los *.bin que mencionas, tb seria que leas acerca de python un buen manual y asi completas lo que falta, las excepciones, depuracion de errores y demas, ademas de crear un buscador de archivos para que no tengas que especificar la ruta, eso lo haces con pocas lineas.
Necesitas python 3 para correrlo.


Título: Re: [Ayuda] ¿Como cortar un cacho del final de un archivo "Bin"?
Publicado por: sr_corsario en 29 Septiembre 2009, 09:00 am
Muchiiiisimas graaacias!!!!!!

Otra petición... ¿Hay alguna manera para que directamente busque el archivo en el directorio donde ejecuto el archivo?

Gracias!

Edit:O asignar uno que siempre sea el mismo...
Supongo que sería cambiando
Código:
direc = input('Ingrese Directorio: ')
por
Código:
direc = os.chdir(path)

pero claro... estoy en las m¡smas ... hay que definir el "path" ...


Título: Re: [Ayuda] ¿Como cortar un cacho del final de un archivo "Bin"?
Publicado por: 43H4FH44H45H4CH49H56H45H en 29 Septiembre 2009, 15:38 pm
Asi podria ser:

Código
  1. import os
  2. def cortar(nomOriginal, nomNuevo, tamArchivo, tamCortar):
  3.    with open(nomOriginal, 'r+b') as file1:
  4.        f1 = file1.read (tamArchivo-tamCortar)
  5.        file1.close()
  6.    with open(nomNuevo, 'w+b') as file2:
  7.        file2.write(f1)
  8.        file2.close()
  9.        print("Cortado Hecho y guardado en: " + nomNuevo)
  10.  
  11. direc = os.getcwd()
  12. dirList = os.listdir(direc)
  13. for fname in dirList:
  14.    if(fname.upper().endswith('.JPG')):
  15.        if(os.path.isfile(direc + fname)== True):
  16.            if(os.path.exists(direc + fname + '.bak')== False):
  17.                print ('Nombre de archivo: '+ fname)
  18.                leno = os.path.getsize(direc + fname)
  19.                print ("inciando cortado en: " + direc + fname)
  20.                os.rename(direc + fname,direc + fname + '.bak')
  21.                cortar(direc + fname + '.bak', direc + fname, leno, 20000)
  22.            else:
  23.                print ('Archivo: ' + direc + fname + ' ya fue cortado')


Título: Re: [Ayuda] ¿Como cortar un cacho del final de un archivo "Bin"?
Publicado por: sr_corsario en 29 Septiembre 2009, 16:20 pm
Buenas!!

Hay algo que falla!! no me hace nada!!



Título: Re: [Ayuda] ¿Como cortar un cacho del final de un archivo "Bin"?
Publicado por: Novlucker en 29 Septiembre 2009, 17:27 pm
Que error te da?
Algo te debe de mostrar  :P

Saludos


Título: Re: [Ayuda] ¿Como cortar un cacho del final de un archivo "Bin"?
Publicado por: 43H4FH44H45H4CH49H56H45H en 29 Septiembre 2009, 19:15 pm
Hazle click derecho al archivo y edit IDLE para correrlo con F5 y ahi en el idle te saldra los errores o similar.


Título: Re: [Ayuda] ¿Como cortar un cacho del final de un archivo "Bin"?
Publicado por: sr_corsario en 30 Septiembre 2009, 12:01 pm
Buenas.

Me sale:
Código:
    
IDLE 3.0      ==== No Subprocess ====
>>>
>>>


Por lo que entiendo que no encuentra ningún archivo en el directorio donde lo ejecuto.

¿Alguna idea?

Edit:
Para ver realmente si estaba en el directorio que debería, le he metido esto:
Código:
for fname in dirList:
    print (fname)
 
Y si... es el directorio que toca... por lo que no entiendo porqué no encuentra el archivo! :(

¿Puedo especificar un nombre de archivo en concreto? (game.bin)
Código:
if(fname.upper().endswith('.bin')):

Gracias


Título: Re: [Ayuda] ¿Como cortar un cacho del final de un archivo "Bin"?
Publicado por: 43H4FH44H45H4CH49H56H45H en 30 Septiembre 2009, 19:11 pm
Código:
if(fname.upper().endswith('.bin')):

seria:

Código:
if(fname.upper().endswith('.BIN')):

Por eso se usa "upper()" y evitamos combinaciones entre may... y min...


Título: Re: [Ayuda] ¿Como cortar un cacho del final de un archivo "Bin"?
Publicado por: sr_corsario en 1 Octubre 2009, 08:33 am
Me sigue sin responder nada.

Código:
import os
def cortar(nomOriginal, nomNuevo, tamArchivo, tamCortar):
    with open(nomOriginal, 'r+b') as file1:
        f1 = file1.read (tamArchivo-tamCortar)
        file1.close()
    with open(nomNuevo, 'w+b') as file2:
        file2.write(f1)
        file2.close()
        print("Cortado Hecho y guardado en: " + nomNuevo)
 
direc = os.getcwd()
dirList = os.listdir(direc)
for fname in dirList:
    if(fname.upper().endswith('.BIN')):
        if(os.path.isfile(direc + fname)== True):
            if(os.path.exists(direc + fname + '.bak')== False):
                print ('Nombre de archivo: '+ fname)
                leno = os.path.getsize(direc + fname)
                print ("inciando cortado en: " + direc + fname)
                os.rename(direc + fname,direc + fname + '.bak')
                cortar(direc + fname + '.bak', direc + fname, leno, 131072)
            else:
                print ('Archivo: ' + direc + fname + ' ya fue cortado')


Perdón por mi torpeza :(

Bueno... mas o menos ya se donde está el error.  Es algo sobre la ruta del directorio. Creo que le falta "\" en el path del archivo, ya que si toqueteo el programa me responde en algún punto "F:\pruebagame.bin" cuando tendría que ser "F:\prueba\game.bin"  Lo que pasa es que yo no se como solucionarlo...

Gracias


Título: Re: [Ayuda] ¿Como cortar un cacho del final de un archivo "Bin"?
Publicado por: 43H4FH44H45H4CH49H56H45H en 2 Octubre 2009, 04:37 am
Con esto deberia funcionar:

Código
  1. import os
  2. def cortar(nomOriginal, nomNuevo, tamArchivo, tamCortar):
  3.    with open(nomOriginal, 'r+b') as file1:
  4.        f1 = file1.read (tamArchivo-tamCortar)
  5.        file1.close()
  6.    with open(nomNuevo, 'w+b') as file2:
  7.        file2.write(f1)
  8.        file2.close()
  9.        print("Cortado Hecho y guardado en: " + nomNuevo)
  10.  
  11. direc = os.getcwd() + '\\'
  12. dirList = os.listdir(direc)
  13. for fname in dirList:
  14.    if(fname.upper().endswith('.BIN')):      
  15.        if(os.path.isfile(direc + fname)== True):
  16.            if(os.path.exists(direc + fname + '.bak')== False):
  17.                print ('Nombre de archivo: '+ fname)
  18.                leno = os.path.getsize(direc + fname)
  19.                print ("inciando cortado en: " + direc + fname)
  20.                os.rename(direc + fname,direc + fname + '.bak')
  21.                cortar(direc + fname + '.bak', direc + fname, leno, 131072)
  22.            else:
  23.                print ('Archivo: ' + direc + fname + ' ya fue cortado')


Título: Re: [Ayuda] ¿Como cortar un cacho del final de un archivo "Bin"?
Publicado por: sr_corsario en 2 Octubre 2009, 09:01 am
GRRrrAAAaCiassss!!! Ahora si que va de PM!!!

Finalmente podré seguir con mi proyecto!!! ;)

Saludos