Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 
Índice general » Mundo Perl » Intermedio » Leer archivos binarios con formato conocido Responder al tema
Nuevo tema


Página 1 de 1  [ 6 mensajes ] 
 
Nota 2011-12-06 07:44 @364

Perlero Nuevo
Registrado: 2011-12-06 07:36 @358
Mensajes: 3
Leer archivos binarios con formato conocido
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!!


Nota 2011-12-06 09:59 @458
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10261
Re: Leer archivos binarios con formato conocido
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


Nota 2011-12-22 13:40 @611

Perlero Nuevo
Registrado: 2011-12-06 07:36 @358
Mensajes: 3
Re: Leer archivos binarios con formato conocido
Así es un trocito de archivo:

Syntax: [ Download ] [ Hide ]
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


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.


Nota 2011-12-22 17:34 @774
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10261
Re: Leer archivos binarios con formato conocido
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:
Syntax: [ Download ] [ Hide ]
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

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


Nota 2011-12-24 07:55 @371

Perlero Nuevo
Registrado: 2011-12-06 07:36 @358
Mensajes: 3
Re: Leer archivos binarios con formato conocido
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
Syntax: [ Download ] [ Hide ]
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

> tail proba
Syntax: [ Download ] [ Hide ]
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


Nota 2011-12-25 11:50 @535
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10261
Re: Leer archivos binarios con formato conocido
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


Responder al tema  [ 6 mensajes ] 

Reglas del Foro
No puedes abrir nuevos temas en este Foro
No puedes responder a temas en este Foro
No puedes editar tus mensajes en este Foro
No puedes borrar tus mensajes en este Foro
No puedes enviar adjuntos en este Foro

Publicidad

Socializa

Síguenos por Twitter

Suscríbete GRATUITAMENTE al Boletín de Perl en Español

Saltar a:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Traducción al español por Huan Manwë para phpbb-es.com
phpBB SEO