• Publicidad

Lectura de binario desde Perl

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

Lectura de binario desde Perl

Notapor alberto_lsa » 2007-06-13 11:44 @530

Hola:

¡Tengo un problema bastante urgente! Tengo un archivo binario en el cual debo acceder y coger 8 bytes.

Estos 8 bytes los tengo que convertir a un número decimal... ¿Cómo lo hago? Estoy probando de mil formas y no hay manera...

¡Gracias!
alberto_lsa
Perlero nuevo
Perlero nuevo
 
Mensajes: 5
Registrado: 2007-06-13 11:40 @528

Publicidad

Notapor creating021 » 2007-06-13 13:50 @618

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/env perl
use strict;

open FL, "archivo.out" or die "Arghhh!: $!\n";
binmode FL;
my $data;
read(FL, $data, <img src="http://perlenespanol.com/foro/images/smilies/icon_cool.gif" alt="8)" title="Cool" />;
foreach my $chr ( split //, $data ){
 printf "HexNo=0x%x\n",oct($chr);
}
close FL;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
Expect the worst, is it the least you can do?
Avatar de Usuario
creating021
Perlero frecuente
Perlero frecuente
 
Mensajes: 595
Registrado: 2006-02-23 16:17 @720
Ubicación: Frente al monitor

Notapor explorer » 2007-06-13 17:04 @753

Bienvenido a los foros de Perl en Español.

Pero, ¿en qué formato están los 8 números binarios?

¿little-endian o big-endian?

Y me parece que la solución de creating021 no es ni solución (¿Pintar valores hexadecimales de los valores decimales de cada byte creyendo que están en formato octal? ¿No habrá querido usar la función ord()?).
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

Notapor alberto_lsa » 2007-06-13 17:17 @761

Hola:

Pues creo que la lectura es de menos significativo a más significativo (es decir, de los 8 caracteres, el de la izda. o el primero que se lee es el que menos peso tiene).

El caso que intento leer carácter a carácter o de 8 en 8, y al pintar por pantalla o pasarlo a otra función el resultado obtenido es siempre 0. No sé cómo tratar lo que leo desde el archivo (no sé si lo leo bien) y tampoco dónde guardar la información (si es necesario alguna variable especial) o así...

¡Una ayudita!

PD: Muchas gracias por la bienvenida...
alberto_lsa
Perlero nuevo
Perlero nuevo
 
Mensajes: 5
Registrado: 2007-06-13 11:40 @528

Notapor creating021 » 2007-06-13 17:20 @764

:lol: Oops, decimal no hexa:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/env perl
use strict;

open FL, "archivo.out" or die "Arghhh!: $!\n";
binmode FL;
my $data;
read(FL, $data, <img src="http://perlenespanol.com/foro/images/smilies/icon_cool.gif" alt="8)" title="Cool" />;
my @decimales = unpack("c*", $data);
close FL;
print "Los decimales son:\n".(join "\t", @decimales)."\n";
 
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

¿Cómo puede influir eso de big y little endian (yo se que es pero...)?
Expect the worst, is it the least you can do?
Avatar de Usuario
creating021
Perlero frecuente
Perlero frecuente
 
Mensajes: 595
Registrado: 2006-02-23 16:17 @720
Ubicación: Frente al monitor

Notapor explorer » 2007-06-13 17:57 @789

Sería interesante que mostraras lo que tienes hecho.

Supongamos que estás en una máquina little-endian.

Una forma de leerlo es parecido a como te muestra creating021:

Código: Seleccionar todo
* leer los 8 bytes
* con el split // podemos ir de carácter en carácter (otra forma sería usando la función substr();)
* Usar las matemáticas para obtener el número decimal:
 n = n * 256 + ord($caracter);

El problema es que el número desborda la representación normal de un entero, por lo que estaremos obligados a usar algo como use bigint;.
Última edición por explorer el 2007-06-13 18:06 @796, editado 1 vez en total
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

Notapor alberto_lsa » 2007-06-13 18:00 @791

Pues no consigo más que obtener 0s todo el rato...

Os subiría el archivo, a ver si conseguís algo, pero no sé si le vasia hacer mucho caso...
alberto_lsa
Perlero nuevo
Perlero nuevo
 
Mensajes: 5
Registrado: 2007-06-13 11:40 @528

Notapor alberto_lsa » 2007-06-13 18:09 @797

Buenas... ahora consigo algo más, pero algunos con signo negativo ( y todos deben ser positivos...), ¿cómo los considero unsigned?

GRACIAS!
alberto_lsa
Perlero nuevo
Perlero nuevo
 
Mensajes: 5
Registrado: 2007-06-13 11:40 @528

Notapor explorer » 2007-06-13 18:10 @798

Si estás en Linux, hazle un
Código: Seleccionar todo
hexdump -C fichero|head

y saldrá el volcado hexadecimal de lor primeros bytes del fichero.
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

Notapor alberto_lsa » 2007-06-13 18:24 @808

El código ahora mismo es:
Código: Seleccionar todo
use strict;

my @dec;
my $puntero;

open FL, "../Recorder_20070612_145112_Gps_streamOutput.idx" or die "Arghhh!: $!\n";
binmode FL;
my $data;
my $igg=0;
while ($igg<200){
read(FL, $data, 1,$igg);
@dec = unpack("C*", $data);
$puntero = @dec[0]+256*@dec[1]+256*256*@dec[2];
#print $puntero."\n";
#print @dec[0].@dec[1].@dec[2].@dec[3].@dec[4].@dec[5].@dec[6].@dec[7];
$igg++;
}
print "Los decimales son:\n".(join "\t", @dec)."\n";
#print @decimales[0]." ".@decimales[1];
close FL;


Por pantalla obtengo lo que quiero, pero cómo lo puedo obtener en una variable vector? con sprintf? Porque al usar @dec[0] ... @dec[7], siempre es 0.

buffffff.
alberto_lsa
Perlero nuevo
Perlero nuevo
 
Mensajes: 5
Registrado: 2007-06-13 11:40 @528

Siguiente

Volver a Intermedio

¿Quién está conectado?

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

cron