2009-09-23 26 views
32

Por ejemplo, quiero crear un archivo llamado sample.bin y poner un número, como 255, de modo que 255 se guarde en el archivo como little-endian, FF 00. O 3826 a F2 0E.¿Cómo puedo crear un archivo binario en Perl?

Intenté usar binmode, como decía el perldoc.

+2

¿Qué le pasa a la gente que alguien votó esta pregunta? –

+0

Creo que mi gramática no es tan buena y no está bien estructurada. – domlao

+1

+1 para compensar -1, eso y es Perl. Sentirse subjetivo : D –

Respuesta

38

La función perl pack devolverá datos "binarios" de acuerdo con una plantilla.

open(my $out, '>:raw', 'sample.bin') or die "Unable to open: $!"; 
print $out pack('s<',255) ; 
close($out); 

En el ejemplo anterior, la 's' le dice que la salida A short (16 bits), y los '<' fuerzas al modo poco-endian.

Además, ':raw' en la llamada a open dice que para poner el gestor de archivo en modo binario en las plataformas en las que importa (que es equivalente a usar binmode). La página del manual PerlIO tiene un poco más de información sobre cómo hacer E/S en diferentes formatos.

+0

wow veo gracias. Soy nuevo en PERL, así que creo que visitaré perldoc para la función de paquete. gracias – domlao

+0

paquete es una buena función. Preste especial atención a los caracteres de plantilla para codificar los valores little-endian vs. big-endian – mob

+0

gracias Adam y mobrule. ¡el paquete es perfecto! gracias – domlao

4

Sí, el uso binmode

Para su entretenimiento (si no educación) mi primer intento de crear un archivo binario incluyen binmode STDOUT y los siguientes:

sub output_word { 
    $word = $_[0]; 
    $lsb = $word % 256; 
    $msb = int($word/256); 
    print OUT chr($lsb) . chr($msb); 
    return $word; 
} 

por piedad NO USE ESTE CÓDIGO! Viene de una época en la que no sabía nada mejor.

Se podría argumentar que todavía no lo hacen, pero se reproduce aquí para demostrar que puede controlar el orden de los bytes, incluso con métodos con muerte cerebral, y porque necesito 'confesar.

Un mejor método sería usar pack como Adam Batkin sugerido.

Creo que cometí la atrocidad anterior en Perl 4. Fue hace mucho tiempo. Desearía poder olvidarlo ...

+3

Miré en algún viejo código recientemente pensando que fue increíble. Era una porquería, y no había hecho demasiada programación en los dos años transcurridos. Leí en alguna parte que si no crees que tu antiguo código es una mierda, entonces hay algo mal contigo. ... ojalá lo recordara, fue un gran artículo. –

+1

Muchas gracias a quien me votó. Ahora puedo eliminar el archivo fuente en el que he estado esperando, y el proceso de curación puede comenzar. – pavium

+1

Si no te gusta tu respuesta, puedes eliminarla. –

8

Puede usar pack para generar sus datos binarios. Para estructuras complejas, Convert::Binary::C es particularmente agradable.

CBC analiza los archivos de encabezado C (ya sea desde un directorio o desde una variable en su secuencia de comandos). Utiliza la información de los encabezados a pack o unpack datos binarios.

Por supuesto, si desea utilizar este módulo, es muy útil saber un poco de C.

CBC le da la posibilidad de especificar el orden de bits y tamaños para sus tipos C, e incluso se puede especificar funciones para convertir entre los tipos nativos de Perl y los datos en el archivo binario. Utilicé esta característica para manejar la codificación y decodificación de números de punto fijo.

Para su ejemplo muy básico que tendría que utilizar:

use strict; 
use warnings; 

use IO::File; 

use Convert::Binary::C; 

my $c = Convert::Binary::C->new('ByteOrder' => 'LittleEndian'); 

my $packed = $c->pack('short int', 0xFF); 

print $packed; 

my $fh = IO::File->new('outfile', '>') 
    or die "Unable to open outfile - $!\n"; 

$fh->binmode; 

$fh->print($packed); 

CBC en realidad no llegar a brillar en este ejemplo, ya que se acaba de trabajar con un único int corto.Si necesita manejar estructuras complejas que pueden tener typedefs extraídos de diferentes encabezados C, estará muy contento de tener esta herramienta a mano.

Como usted es nuevo en Perl, le sugiero que siempre use stict y use warnings. Además, puede use diagnostics para obtener explicaciones más detalladas de los mensajes de error. Tanto este sitio como Perlmonks tienen mucha información buena para principiantes y muchas personas muy inteligentes y capacitadas dispuestas a ayudarlo.

Por cierto, si decides ir a la ruta pack, echa un vistazo al pack tutorial, esto ayuda a aclarar la documentación algo desconcertante del paquete.

+0

gracias por las sugerencias y por el enlace del tutorial del paquete :) – domlao

Cuestiones relacionadas