[Solucionado]¿Como cortar un cacho del final de un archivo?

Iniciado por sr_corsario, 27 Septiembre 2009, 18:34 PM

0 Miembros y 3 Visitantes están viendo este tema.

sr_corsario

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


leogtz

Pues podríamos hacer un script para cortarlo, sabiendo donde hay que cortar.  :-\
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

sr_corsario

#2
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


xassiz_




YXVuIGVyZXMgbWF0YWRvIHBhcmEgcG9uZXJ0ZSBhIGRlc2NpZnJhciBlc3RvIHhE


xassiz_

Cita de: Darioxhcx en 27 Septiembre 2009, 20:44 PM
Cita de: xassiz en 27 Septiembre 2009, 20:33 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..



YXVuIGVyZXMgbWF0YWRvIHBhcmEgcG9uZXJ0ZSBhIGRlc2NpZnJhciBlc3RvIHhE

sr_corsario

Cita de: Darioxhcx en 27 Septiembre 2009, 20:44 PM
Cita de: xassiz en 27 Septiembre 2009, 20:33 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


43H4FH44H45H4CH49H56H45H

Pudes hacerlo con python:
Código (python) [Seleccionar]
os.path.getsize para obtener el tamaño del archivo y de ahi restar los bytes que quieres sacar, hacer un
Código (python) [Seleccionar]
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 (vb) [Seleccionar]
Open archivo For Binary As #numero
Get
Put
LOF(numero)
'datos como Byte, Long y demas
y haces el mismo procedimiento o puedes utilizar otro lenguaje mas rapido como c  o en caso de c++ podrias utilizar:
Código (cpp) [Seleccionar]
ios::binary, ios::out, ios::in
Supongo que en Vb Script tb pueda hacerse, pero voz eliges.

-R IP
:0100
-A 100 
2826:0100 MOV AH,09
2826:0102 MOV DX,109
2826:0105 INT 21
2826:0105 MOV AH,08
2826:0105 INT 21
2826:0107 INT 20
2826:0109 DB 'MI NICK ES CODELIVE.$' 
2826:0127 
-R BX
:0000
-R CX
:20
-N CODELIVE.COM
-W

sr_corsario

#8
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

43H4FH44H45H4CH49H56H45H

Te puedo dar un poco de ayuda de pasada en python:
Código (python) [Seleccionar]
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 = input('Ingrese Directorio: ')
dirList = os.listdir(direc)

for fname in dirList:
    if(fname.upper().endswith('.JPG')):
        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, 1000)
            else:
                print ('Archivo: ' + direc + fname + ' ya fue cortado')


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 (python) [Seleccionar]
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.

-R IP
:0100
-A 100 
2826:0100 MOV AH,09
2826:0102 MOV DX,109
2826:0105 INT 21
2826:0105 MOV AH,08
2826:0105 INT 21
2826:0107 INT 20
2826:0109 DB 'MI NICK ES CODELIVE.$' 
2826:0127 
-R BX
:0000
-R CX
:20
-N CODELIVE.COM
-W