• Publicidad

Leer archivos binarios con formato conocido

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

Leer archivos binarios con formato conocido

Notapor eduuu » 2011-12-06 07:44 @364

A ver, me presento: soy eduuu y ya sé programar un poco con Perl.

A pesar de todo no soy profesional informático y necesitaría resolver una duda, que me es imposible resolver solo porque no entiendo muchas cosas.

Necesito leer un archivo en formato binario, y sé lo siguiente:

Formato del titulo: FORMAT(20A4) ITITL donde ITITL es el título.
Formato del cuerpo: FORMAT(10F8.3) (X(i), Y(i), Z(i), i=1,NATOM)

¿Cómo lo tengo que leer, tengo suficiente información? ¿Necesito el número de bits?

A ver si alguien me puede decir cómo va...

¡¡Muchas gracias!!
eduuu
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2011-12-06 07:36 @358

Publicidad

Re: Leer archivos binarios con formato conocido

Notapor explorer » 2011-12-06 09:59 @458

Bienvenido a los foros de Perl en español, eduuu.

El formato del que hablas es el de los archivos AMBER, que, me parece, sigue la nomenclatura de los FORMAT del lenguaje FORTRAN.

Entonces, 20A4 quiere decir 20 veces un carácter que ocupa 4 posiciones, ¿no? Pero, ¿en qué codificación?

Y el formato 10F8.3 se refiere a 10 valores en punto flotante, de 8 posiciones cada uno, con 3 decimales, suponiendo en notación anglosajona (el punto separa a los decimales).

¿Es así?

¿Podrías volcar aquí (directamente o en hex) un ejemplo del comienzo de ese fichero? O adjuntar una parte...
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Leer archivos binarios con formato conocido

Notapor eduuu » 2011-12-22 13:40 @611

Así es un trocito de archivo:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
0000050 6563 6c6c 735f 6170 6974 6c61 0000 0300
0000060 0000 0c00 6563 6c6c 615f 676e 6c75 7261
0000070 0000 0300 0000 0c00 0000 0600 0000 0500
0000080 6974 6c74 0065 0000 0000 0200 0000 0300
0000090 4341 0031 0000 0b00 7061 6c70 6369 7461
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Quería ponerte uno entero... pero en fin, no lo he conseguido. No sé... ¿Tienes suficiente con este trocito? Es que son muy grandes y no sé cómo cortarlos... No sé cómo tratar con ellos.
eduuu
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2011-12-06 07:36 @358

Re: Leer archivos binarios con formato conocido

Notapor explorer » 2011-12-22 17:34 @774

Pues... poco podemos sacar de eso... ¿porqué nos mandas a partir del byte número 80? Lo que nos interesa es el principio del fichero.

De momento, podemos deducir que es una arquitectura litte-endian, y que las cadenas reconocibles son:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
6563 6c6c 735f 6170 6974 6c61 : ceoo_spatial
6563 6c6c 615f 676e 6c75 7261 : ceoo_angular
6974 6c74 0065                : title
4341 0031                     : AC1
7061 6c70 6369 7461           : applicat
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Entre medias, hay números enteros.

No sé... No conozco los archivos AMBER, pero no consigo encajar esta información con la que debería ser un archivo con esas características.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Leer archivos binarios con formato conocido

Notapor eduuu » 2011-12-24 07:55 @371

Te pongo la cabeza y la cola (de un archivo de varias gigas), seguramente que todos son números y solo números, o prácticamente todo.

> head proba
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
0000000 4443 0246 0000 1027 0000 0a00 0000 0600
0000010 0000 0500 7266 6d61 0065 0000 0000 0000
0000020 0000 0700 7073 7461 6169 006c 0000 0300
0000030 0000 0400 7461 6d6f 0000 6419 0000 0500
0000040 616c 6562 006c 0000 0000 0500 0000 0c00
0000050 6563 6c6c 735f 6170 6974 6c61 0000 0300
0000060 0000 0c00 6563 6c6c 615f 676e 6c75 7261
0000070 0000 0300 0000 0c00 0000 0600 0000 0500
0000080 6974 6c74 0065 0000 0000 0200 0000 0300
0000090 4341 0031 0000 0b00 7061 6c70 6369 7461
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

> tail proba
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
2e85ccd0 f941 debd 8341 bd58 8341 614f 0242 f32f
2e85cce0 7a41 8e78 8541 4339 4940 e9ec 2042 e205
2e85ccf0 ea41 2b05 2b40 a7d4 2142 80ba f041 d58a
2e85cd00 2e40 5458 1c42 8d43 e941 894a 0441 0fdd
2e85cd10 2741 f08f fd41 7e26 f040 b751 3041 7dd2
2e85cd20 fe41 a26d 0c41 f56a 2d41 18d0 f641 9b83
2e85cd30 4540 872f 7561 82a7 4440 1554 5c44 128a
2e85cd40 4240 2635 bba3 4c66 5640 0080 0000 0000
2e85cd50 5640 0080 0000 0000 5640 0080 0000 0000
2e85cd60
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
eduuu
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2011-12-06 07:36 @358

Re: Leer archivos binarios con formato conocido

Notapor explorer » 2011-12-25 11:50 @535

Bueno, creo que ya está identificado.

Se trata de un fichero AMBER Trajectory, en formato NetCDF (Network Common Data Form). Aquí tienes una descripción general de los distintos campos del fichero.

Lo que no entiendo es por qué está todo el fichero en formato little-endian... algo le ha pasado...

Como se indica ahí, todo el proceso de lectura y escritura en el fichero se debe realizar (es recomendable) con las bibliotecas de NetCDF.

En Perl hay una interfaz para ese tipo de ficheros: PDL::NetCDF, aunque también puedes ejecutar las utilidades NetCDF, como ncdump, por ejemplo, para sacar toda la información del fichero (ejemplo) (es la opción que usé hace años para leer archivos de estos, pero con información de imágenes de satélites).

No te merece la pena desarrollar un programa Perl para leer estos archivos. La empresa Unidata dispone de librerías Perl que permiten acceder a directamente a estos ficheros, haciendo uso de la biblioteca libnetcdf (readme). O la anterior comentada PDL::NetCDF.

Tienes también un paquete llamado NetCDFPerl, pero quizás sea un poco viejo. Bueno, el formato CDF apenas ha cambiado en años.

Finalmente (no he mirado más), en Debian tienes (tenías) un paquete llamado netcdf-perl. Digo 'tenías' porque existió solo hasta la distribución Etch. A partir de entonces solo está el libpdl-netcdf-perl.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Intermedio

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 6 invitados