Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 30-05-2007
PTW PTW is offline
Miembro
 
Registrado: abr 2004
Posts: 55
Poder: 21
PTW Va por buen camino
Pasar ficheros binarios a texto

Hola a todos!!

Necesito hacer un programa que lea un ficheros binario del disco duro y cree un fichero de texto con su contenido. Del contenido fichero binario no sé ninguna información en cuanto a la estructura que tiene

al no conocer la estrcutra que tiene, ¿debo leerlo byte a byte, o con un TFileStream?

¿Me podeis echar un cable u orientarme un poco?

Muchas gracias
Responder Con Cita
  #2  
Antiguo 30-05-2007
Avatar de cHackAll
[cHackAll] cHackAll is offline
Baneado?
 
Registrado: oct 2006
Posts: 2.159
Poder: 20
cHackAll Va por buen camino
Cool Ok

Debes realizar una lectura byte por byte, cuando encuentres un caracter de texto ['a'..'z', 'A'..'Z', ' ', '.'..... etc ....'?'] debes verificar si los siguientes N (por ejemplo 4) caracteres tambien son texto, en tal caso escribes esos N bytes en otro archivo... no olvides inclur el #13#10.

Suerte!
Responder Con Cita
  #3  
Antiguo 30-05-2007
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
No entiendo muy bien lo que necesitas, pero aquí te dejo un código que puede que te sirva:

http://www.clubdelphi.com/foros/show...71&postcount=2
Responder Con Cita
  #4  
Antiguo 31-05-2007
Avatar de cHackAll
[cHackAll] cHackAll is offline
Baneado?
 
Registrado: oct 2006
Posts: 2.159
Poder: 20
cHackAll Va por buen camino
Cool Solucion

Creo que te es mas util el siguiente código... use pura API porque me gusta. Para las cadenas Unicode debes contar como un caracter si, un 0, otro si otro 0, etc, etc... para aumentar el "rango" cambia agrega contenido a la func. IsLetter.

Código Delphi [-]
function IsLetter(const Char: System.Char): LongBool;
begin
 Result := Char in ['a'..'z', 'A'..'Z', '0'..'9', ' '];
end;

const CrLf: Word = $0A0D;
var hFile, Index, Size, Dummy: Cardinal; lpBuffer: PChar;
begin
 hFile := CreateFile('c:\ntldr', GENERIC_READ, 0, nil, OPEN_EXISTING, 0, 0);
 lpBuffer := MapViewOfFile(CreateFileMapping(hFile, nil, PAGE_READONLY, 0, 0, nil), FILE_MAP_READ, 0, 0, 0);
 Size := GetFileSize(hFile, nil);
 CloseHandle(hFile);

 hFile := CreateFile('c:\ntldr.txt', GENERIC_WRITE, 0, nil, CREATE_ALWAYS, 0, 0);
 Index := 0;
 while Index < Size do
  begin
   if ((Size - Index) > 3) and
      IsLetter(lpBuffer[Index]) and
      IsLetter(lpBuffer[Index + 1]) and
      IsLetter(lpBuffer[Index + 2]) and
      IsLetter(lpBuffer[Index + 3]) then
    begin
     while (Index < Size) and IsLetter(lpBuffer[Index]) do
      begin
       WriteFile(hFile, lpBuffer[Index], 1, Dummy, nil);
       Inc(Index);
      end;
     WriteFile(hFile, CrLf, 2, Dummy, nil);
    end
   else
    Inc(Index);
  end;
 CloseHandle(hFile);
end;

Espero te sirva.
Suerte!
Responder Con Cita
  #5  
Antiguo 31-05-2007
PTW PTW is offline
Miembro
 
Registrado: abr 2004
Posts: 55
Poder: 21
PTW Va por buen camino
Pues son unos ficheros que genera un programa (tienen extensión .B00). Si lo intentas abrir con un editor de texto aparecen caracteres extraños, no se puede leer. Y necesito generar un fichero de texto, y escribir el contenido de ese fichero en codigo Ascii.
Responder Con Cita
  #6  
Antiguo 31-05-2007
Avatar de ArdiIIa
[ArdiIIa] ArdiIIa is offline
Miembro Premium
 
Registrado: nov 2003
Ubicación: Valencia city
Posts: 1.481
Poder: 22
ArdiIIa Va por buen camino
Cita:
Empezado por PTW
Del contenido fichero binario no sé ninguna información en cuanto a la estructura que tiene
///////////
Pues son unos ficheros que genera un programa (tienen extensión .B00). Si lo intentas abrir con un editor de texto aparecen caracteres extraños, no se puede leer. Y necesito generar un fichero de texto, y escribir el contenido de ese fichero en codigo Ascii.
Pues dado que no puedes aportar mucho sobre el asunto, antes de comenzar con algoritmo alguno, también deberías considerar que el programa tiene su propio formato e incluso, porque no, tal vez codifique esos ficheros para que nadie los pueda leer.

Ese programa tiene nombre ?
Sirve para algo en concreto ?
Solamente procesa texto ?

En fin son unas cuestiones dignas de tener en cuenta antes de leer Ascii ¿No crees?
__________________
Un poco de tu generosidad puede salvar la vida a un niño. ASÍ DE SENCILLO
Responder Con Cita
  #7  
Antiguo 31-05-2007
Avatar de cHackAll
[cHackAll] cHackAll is offline
Baneado?
 
Registrado: oct 2006
Posts: 2.159
Poder: 20
cHackAll Va por buen camino
Cool Asi es!


Cita:
Empezado por ArdiIIa
...
Ese programa tiene nombre ?
Sirve para algo en concreto ?
Solamente procesa texto ?
...
Concuerdo con ArdiIIa, lo peor del asunto es que revisando éste link dice que es un gráfico!!!

Es un archivo pequeño? por que no lo comprimes y lo subes para ver si te podemos ayudar? y porfavor explicanos bien!

Saludos

Última edición por cHackAll fecha: 31-05-2007 a las 03:25:23.
Responder Con Cita
  #8  
Antiguo 31-05-2007
PTW PTW is offline
Miembro
 
Registrado: abr 2004
Posts: 55
Poder: 21
PTW Va por buen camino
Hola de nuevo. Perdon por el retraso en contestar.

Efectivamente, esos ficheros con extensión B00 contienen información sobre imágenes. Es un programa sobre copias digitales de fotografias

Del fichero en cuestion, me interesa sacar la informacion de los nombres de los JPG (fotos) que contiene, y las copias de cada foto. Pero bueno, en principio sacando los nombres de los jpgs que contiene el fichero B00 me vendría muy bien

Os subo un fichero de pruebas, porque veo que me explico como el culo

Gracias
Archivos Adjuntos
Tipo de Archivo: zip 250.zip (940 Bytes, 15 visitas)
Responder Con Cita
  #9  
Antiguo 31-05-2007
Avatar de cHackAll
[cHackAll] cHackAll is offline
Baneado?
 
Registrado: oct 2006
Posts: 2.159
Poder: 20
cHackAll Va por buen camino
Cool Entonces...

Bueno en ESE caso te dejo mi misma funcion un poco modificada:

Código Delphi [-]
function GetCardinal(var Buffer): Cardinal;
asm
 mov eax, [eax]
end;
 
const CrLf: Word = $0A0D;
var hFile, Index, Size, Count, Dummy: Cardinal; lpBuffer: PChar;
begin
 hFile := CreateFile('c:\250.b00', GENERIC_READ, 0, nil, OPEN_EXISTING, 0, 0);
 lpBuffer := MapViewOfFile(CreateFileMapping(hFile, nil, PAGE_READONLY, 0, 0, nil), FILE_MAP_READ, 0, 0, 0);
 Size := GetFileSize(hFile, nil);
 CloseHandle(hFile);
 hFile := CreateFile('c:\FileNames.txt', GENERIC_WRITE, 0, nil, CREATE_ALWAYS, 0, 0);
 Index := 0;
 while Index < Size do
  begin
   if GetCardinal(lpBuffer[Index]) = $67706A2E then // '.jpg'
    begin
     Count := 0;
     while lpBuffer[Index - Count - 1] in ['a'..'z', 'A'..'Z', '0'..'9'] do Inc(Count);
     WriteFile(hFile, lpBuffer[Index - Count], Count + 4, Dummy, nil);
     WriteFile(hFile, CrLf, 2, Dummy, nil);
     Inc(Index, 4);
    end
   else
    Inc(Index);
  end;
 CloseHandle(hFile);
end;

Si no te saca todos los nombres es porque hay algunos Unicode, en ese caso nos comentas!

Suerte & Saludos!
Responder Con Cita
  #10  
Antiguo 31-05-2007
Avatar de cHackAll
[cHackAll] cHackAll is offline
Baneado?
 
Registrado: oct 2006
Posts: 2.159
Poder: 20
cHackAll Va por buen camino
Cool Me olvidaba decirte...

Me olvidaba! el archivo que subiste tiene muchos espacios! lo guardaste con Bloc de notas verdad????
Si es el caso NO lo vuelvas a hacer pues la ayuda que te den puede no servirte siempre para todos los casos!

Saludos!
Responder Con Cita
  #11  
Antiguo 31-05-2007
PTW PTW is offline
Miembro
 
Registrado: abr 2004
Posts: 55
Poder: 21
PTW Va por buen camino
Hola cHackAll!!
Muchas gracias tio. Con esto espero que me ayude a sacar el resto de información que necesito. Por si acaso, no te vayas muy lejos

El fichero viene así, tal como lo he subido.

Saludos. Y gracias de nuevo

PD: En vez de cHackAll, te deberias llamar cHacracK, o yatá ( de lo rapido que lo has hecho)
Responder Con Cita
  #12  
Antiguo 31-05-2007
Avatar de cHackAll
[cHackAll] cHackAll is offline
Baneado?
 
Registrado: oct 2006
Posts: 2.159
Poder: 20
cHackAll Va por buen camino
Cool De nada

Es un placer ayudarte amigo, mediante evolucione tu sistema y necesitas ayuda nos escribes un post cuando lo necesites, pero procura cuidar tu lexico ok? no estoy muy de acuerdo con la palabrilla que acabo de leer pues no es muy comun en los foros.

Cita:
Empezado por PTW
...Os subo un fichero de pruebas, porque veo que me explico como el !$"%
Un saludo.
Responder Con Cita
  #13  
Antiguo 01-06-2007
PTW PTW is offline
Miembro
 
Registrado: abr 2004
Posts: 55
Poder: 21
PTW Va por buen camino
Ok, no te preocupes. No volverá a pasar.

Una cosa sobre el código que has mandado:

Supongo que "$67706A2E
" es la representación en Hexadecimal de la tabla Ascii de la cadena ".jpg" ¿no?.

Pero he intentado buscar una cadena que empieza por "ID" (ya que me interesa el valor que tiene viene a continuación: ejemplo ID10)

Pero al hacer:
Código Delphi [-]if GetCardinal(lpBuffer[Index]) = $4449 then // 'ID'

nunca entra en ese if

¿Que es lo que estoy haciendo mal?
¿De donde sacas la representación de cada caracter? ¿de la tabla Ascii?

Saludos








Responder Con Cita
  #14  
Antiguo 01-06-2007
Avatar de cHackAll
[cHackAll] cHackAll is offline
Baneado?
 
Registrado: oct 2006
Posts: 2.159
Poder: 20
cHackAll Va por buen camino
Cool Ok

Cita:
Empezado por PTW
...Supongo que "$67706A2E" es la representación en Hexadecimal de la tabla Ascii de la cadena ".jpg" ¿no?.
Exactamente!

Cita:
Empezado por PTW
...Pero he intentado buscar una cadena que empieza por "ID" (ya que me interesa el valor que tiene viene a continuación: ejemplo ID10)
Debes tener MUY en cuenta que esta funcion que hice, encuentra '.jpg' y recorre luego hacia atras para copiar todo el nombre!

Cita:
Empezado por PTW
...Pero al hacer:
if GetCardinal(lpBuffer[Index]) = $4449 then // 'ID'
nunca entra en ese if
por supuesto, la funcion GetCardinal retorna una variable de 32 bits (4 bytes), de estos solo necesitas 2... entonces con:

Código Delphi [-]
if Word(GetCardinal(lpBuffer[Index])) = $4449 then
solucionas el problema, te lo dejo misma funcion un poco mejorada por si las dudas:

Código Delphi [-]
function GetCardinal(var Buffer): Cardinal;
asm
 mov eax, [eax]
end;
 
const CrLf: Word = $0A0D;
var hFile, Index, Size, Count, Dummy: Cardinal; lpBuffer: PChar; Found: LongBool;
begin
 hFile := CreateFile('c:\250.b00', GENERIC_READ, 0, nil, OPEN_EXISTING, 0, 0);
 if hFile = INVALID_HANDLE_VALUE then
  begin
   MessageBox(0, 'No se puede acceder al archivo!', nil, MB_ICONEXCLAMATION);
   Exit;
  end;
 lpBuffer := MapViewOfFile(CreateFileMapping(hFile, nil, PAGE_READONLY, 0, 0, nil), FILE_MAP_READ, 0, 0, 0);
 Size := GetFileSize(hFile, nil);
 CloseHandle(hFile);
 hFile := CreateFile('c:\FileNames.txt', GENERIC_WRITE, 0, nil, CREATE_ALWAYS, 0, 0);
 Index := 0;
 Found := False;
 while Index < Size do
  begin
   if not Found and (Word(GetCardinal(lpBuffer[Index])) = $4449) then // 'ID'
    begin
     Count := 1;
     Inc(Index, 2);
     while lpBuffer[Index + Count] in ['0'..'9'] do Inc(Count);
     WriteFile(hFile, lpBuffer[Index], Count, Dummy, nil);
     WriteFile(hFile, CrLf, 2, Dummy, nil);
     WriteFile(hFile, CrLf, 2, Dummy, nil);
     Inc(Index, Count);
     Found := True;  // No debemos volver a antrar acá, pues puede haber algun nombre de archivo con ID
    end
   else
    if GetCardinal(lpBuffer[Index]) = $67706A2E then // '.jpg'
     begin
      Count := 0;
      while lpBuffer[Index - Count - 1] in ['a'..'z', 'A'..'Z', '0'..'9'] do Inc(Count);
      WriteFile(hFile, lpBuffer[Index - Count], Count + 4, Dummy, nil);
      WriteFile(hFile, CrLf, 2, Dummy, nil);
      Inc(Index, 4);
     end
    else
     Inc(Index);
  end;
 CloseHandle(hFile);
end;

Así y todo me queda la duda de que si los archivos pueden contener el nombre 'ID', en ese caso sirve la variable 'Found'
Además hay la posiblidad de que todos los archivos tengan ESE dato en una posicion fija, pero en todo caso la funcion anterior sirve.

Suerte!
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Pasar ficheros de Theos a otro Formato Triton Varios 4 30-10-2007 23:03:33
ficheros binarios e imagenes sapi Varios 2 03-10-2006 16:50:34
Correo Web y Ficheros de Texto. marcoszorrilla Varios 29 06-09-2006 22:51:55
Leer enteros de 32-bits en ficheros binarios elcaracas C++ Builder 2 08-04-2005 21:46:54
Ficheros binarios deimonio Varios 2 29-12-2003 13:38:47


La franja horaria es GMT +2. Ahora son las 22:03:08.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi