Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Binario a Texto (https://www.clubdelphi.com/foros/showthread.php?t=78806)

gusspagano 17-05-2012 23:25:07

Binario a Texto
 
Hola a todos, tengo un problema y les agradecería mucho su ayuda.

tengo un archivo binario, el cual quiero convertir a texto he usado la función blockread y luego intento escribir lo que leyó la función en un txt, algo asi:

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
  arc:file;
  b:word;
  i:integer;
  arr:textfile;
begin
  assignfile(arc,'I:\Radar raw data\20080101 a 20080219\RAW_NA_000_236_20080101001008');
  reset(arc,2);
  assignfile(arr,'D:\Users\Alvao\Desktop\culos.txt');
  ReWrite(arr);
  while not eof (arc) do
  begin
    blockread(arc,b,1);
    Write(arr,inttostr(b));
  end;
end;

Lo único que veo en el archivo que creo son puros números.

Se supone que el binario es de texto, me explico, es texto que pusieron en un archivo binario por que un txt estaría muy pesado, entonces yo necesito abrir el binario convertirlo a texto, leer una parte de él guardarlo en otro txt.

ya tengo rato con esto no nomas no puedo,

gracias por su ayuda.

ecfisa 18-05-2012 02:22:19

Hola gusspagano.

Creo que tenes que dar mas detalles...

¿ Que tipo de datos tiene el archivo "RAW_NA_000_236_20080101001008" ? Por el nombre pareciera una imagen en formato RAW, pero no podría asegurarlo sin ver la extensión.

Cita:

Se supone que el binario es de texto, me explico, es texto que pusieron en un archivo binario por que un txt estaría muy pesado
¿ Como que el binario es de texto ? Un archivo binario no es de texto aún si se le cambia la extensión. Por otro lado si el archivo de texto fuera muy pesado (para enviarlo supongo) lo normal sería comprimirlo con alguna herramienta.

Por eso te decía que tendrías que dar más detalles sobre el formato del archivo orígen y también que que es lo que deseas hacer con lo que leas de él.

Si no se corre el riesgo de hacer las cosas como el traste... ('D:\Users\Alvao\Desktop\culos.txt') :)

Saludos.

gusspagano 18-05-2012 06:39:33

jajaja, que tal ecfisa,

mira, el archivo que tengo es generado por un radar, el archivo no tiene extensión (así se genera) se supone que el tipo de dato que contiene es texto, primero un encabezado, después cantidades que representan la reflectividad que mide el radar en un espacio dado en la atmósfera.

ahora el radar genera dos archivos de estos cada 15 minutos y pesan al rededor de 400 KB, como la cantidad de archivos que genera el radar es bastante considerable (192 al dia por 365 dias al año, etc.) se genera un binario por que su tamaño en mucho menor que un txt, lo que quiero hacer con este archivo es leer una parte de él para calcular precipitación a partir de la reflectividad.

Este es un ejemplo que viene en el manual del radar, algo así debería verse el archivo una vez convertido a texto.

0 12 <raw_prod_bhdr>
12 76 <ingest_data_header>
88 SINT2 –32762 (code for six data words to follow)
90 BIN2 0 (starting azimuth) Six
92 BIN2 91 (starting elevation) words
94 BIN2 182 (ending azimuth) referred
96 BIN2 91 (ending elevation) to
98 SINT2 200 (number of range bins) above
100 UINT2 3 (time)
102 SINT2 50 (code for fifty zeros skipped)
104 SINT2 –32767 (code for one data word follows)
106 SINT2 128 (zero velocity value) One data word
108 SINT2 49 (code for forty nine zeros skipped)
110 SINT2 1 (code for end of ray)
112
(Continues on to next ray)

ecfisa 18-05-2012 07:55:06

Hola gusspagano. :)

Entendido perfecto lo del archivo de texto y también que se lo almacena en otro formato para ganar espacio. (Y que no tiene nada que ver con la anatomía. :D)

El problema es saber con que formato es guardado el archivo 'RAW_NA_...', por que de eso depende la interpretación que le demos al leerlo.

Mi pregunta concreta es: ¿ El archivo es generado por un programa de tu autoría o por una aplicación de terceros ?

Si es el primer caso, no veo mucha dificultad ya que con decirnos como se guarda asunto solucionado, pero de otro modo es más complicado.
La opción más sencilla sería buscar el formato en los manuales o comunicarse con el/los autores para consultarlo.
La otra es tratar de inferir el formato a partir de la comparación entre el archivo generado y su equivalente de texto. Pero esto puede ser muy pero muy trabajoso, sobre todo por que es muy probable que se haga algun tipo de compresión de los datos antes de guardarse.

Un saludo.

gusspagano 18-05-2012 08:09:11

Hola de nuevo,

La aplicación que genera los archivos es del fabricante del radar, ahora, a que te refieres con el "formato"?, (perdón por esta pregunta la verdad se muy poco de informática y programación), se que el archivo es binario y que son palabras de 16 bits según el manual, también conozco el algoritmo de compresión/descompresión (el que según yo podré aplicar una vez tenga el archivo de texto), no se si haga falta saber algo más.

Disculpa si no me doy a entender bien, no se mucho de estas cuestiones.

ecfisa 18-05-2012 08:55:32

Hola.

No te disculpes te has explicado perfectamente.

Cuando hablo del formato me refiero a como guarda los datos en el archivo, si se guarda el valor ASCII de de los caracteres, o se empaquetan por algún método (Ocho en siete, suprimiendo caracteres no utilizables, etc.)

En resumidas cuentas, la cuestión es como interpretar los datos almacenados en ese archivo binario. Es decir ¿Que debemos leer ? Un Byte, Integer, Word,... y una vez sabido el tipo que vamos a leer, ¿ Como extraemos cada caracter de allí ?

Saludos.

gusspagano 20-05-2012 22:45:35

Hola,

Bueno, al parecer se guardan los valores ASCII pues el manual no dice otra cosa, y en cuanto a lo que hay que leer es Word (palabras de 16 bits), ahora, es esto suficiente para convertir a texto??, que función puedo usar??

ecfisa 20-05-2012 23:29:11

Cita:

Empezado por gusspagano (Mensaje 433048)
Hola,

Bueno, al parecer se guardan los valores ASCII pues el manual no dice otra cosa, y en cuanto a lo que hay que leer es Word (palabras de 16 bits), ahora, es esto suficiente para convertir a texto??, que función puedo usar??

Hola gusspagano.

Ateniendome a lo que me comentas, una forma de leerlo sería:
Código Delphi [-]
var
  FileWord: file of Word;
  s: string;
  W: Word;
begin
  AssignFile(FileWord, 'C:\TU_RUTA\TU_ARCHIVO.BIN');
  try
    Reset(FileWord);
    with TStringList.Create do
    try
      while not Eof(FileWord) do
      begin
        s:= '';
        repeat
          Read(FileWord, W);
          s:= s + Chr(W);
        until (W = 13) or Eof(FileWord);
        if not Eof(FileWord) then TS.Add(s);
      end
    finally
      // El contenido ya está en TS. 
      // Como ejemplo copio a un Memo y luego libero TS
      Memo1.Lines:= TS;
      TS.Free
    end
  finally
    CloseFile(FileWord)
  end
end;

Saludos.

gusspagano 22-05-2012 19:14:47

Hola ecfisa,

lo intente pero sigo viendo puros simbolos, voy a checar otra vez el manual y a ver que encuentro, si logro hacer algo lo comento.

Muchas gracias por tu ayuda.

gusspagano 05-06-2013 21:09:06

Pues bien, después de más de un año, pude convertir mis archivos RAW en TXT. Resulta que el archivo estaba basado en palabras de 16 bits (declaré el archivo como "file of word"), y estructurado en registros (de 6144 bytes cada uno), así que todo lo que leía eran cantidades entre 0 y 65535 (rango de valores de enteros sin signo de 16 bits). Luego, cada uno de esos datos o cantidades leidas correspondía a un valor que aplicando una formula que se encuentra en el manual del radar me da el valor de reflectividad, con el cual ya puedo estimar precipitación.

Por último use el código de compresión que viene en el manual para descomprimir los archivos. El código consiste en reemplazar cadenas de ceros por un número que indica la cantidad de ceros que han sido reemplazados.

Listo, luego solo automaticé el proceso para leer los más de 60 mil archivos RAW y generar imágenes de precipitación acumulada en 24 horas.

Esto probablemente no le interese a muchas personas, pero por si hubiera alguien por ahí que se tope con un problema similar al mio, sepa que si hay una solución, que me costó mucho encontrar, pero finalmente pude hacerlo.

Saludos ecfisa y gracias por tu ayuda.

Casimiro Noteví 05-06-2013 21:19:37

^\||/
.


La franja horaria es GMT +2. Ahora son las 06:28:54.

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