Por ejemplo, quiero crear un archivo llamado sample.bin y poner un número, como 255, por lo que 255 se guarda en el archivo como «little-endian», FF 00. O 3826 a F2 0E.

He intentado utilizar binmode, como el perldoc dijo.

InformationsquelleAutor domlao | 2009-09-23

3 Comentarios

  1. 42

    El Perl pack función devolverá «binario» de los datos de acuerdo a una plantilla.

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

    En el ejemplo anterior, el 's' dice que la salida de un short (16 bits), y el '<' obliga a little-endian modo.

    Además, ':raw' en la llamada a open le dice que se ponga el filehandle en modo binario en las plataformas donde lo que importa (es equivalente a usar binmode). El PerlIO página de manual tiene un poco más de información en el I/O en diferentes formatos.

    • wow veo gracias. soy nuevo en PERL así que creo que voy a visitar perldoc para el paquete de la función. gracias
    • pack es una buena función. Prestar especial atención a que la plantilla de caracteres para la codificación de «little-endian» vs big-endian valores
    • gracias Adán y mobrule. pack es perfecto! gracias
    • Recuerde que el idioma es el Perl y el intérprete/compilador de perl. No quiero ser pedante, pero mis-aprovechando el idioma es un problema común.
    • por favor, no use 2-argumento la forma de abrir. Cuando se combina con nombres de variables crea un enorme agujero de seguridad a la espera de ser explotados. El uso de léxico filehandles también es una buena idea (que limita el alcance de su filehandle). Su abierta declaración debe ser reescrito como open( my $out, '>', 'sample.bin') or die "Blah $!";
    • perldoc.perl.org/perlpacktut.html

  2. 10

    Puede utilizar pack para generar los datos binarios. Para estructuras complejas, Convertir::Binary::C es particularmente agradable.

    CBC analiza los archivos de cabecera C (ya sea a partir de un directorio o de una variable en el script). Se utiliza la información de los encabezados de pack o unpack datos binarios.

    Por supuesto, si usted desea utilizar este módulo, es útil conocer algunos de C.

    CBC te da la posibilidad de especificar el peso y tamaños de los tipos de C, y usted puede incluso especificar las funciones para convertir entre nativos Perl tipos de datos y los datos en el archivo binario. He usado esta característica para manejar la codificación y decodificación de punto fijo de números.

    Por su ejemplo muy básico usaría:

    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 realmente no consigue brillar en este ejemplo, ya que es trabajar con una sola short int. Si usted necesita para manejar estructuras complejas que pueden tener las definiciones de tipos sacados de diferentes cabeceras de C, usted será muy feliz de tener esta herramienta en la mano.

    Ya que eres nuevo en Perl, voy a sugerir que usted siempre use stict y use warnings. También, usted puede use diagnostics para obtener explicaciones más detalladas para los mensajes de error. Este sitio y Perlmonks tienen un montón de buena información para los principiantes y muchos muy inteligente, hábil con personas dispuestas a ayudar.

    Por CIERTO, si usted decide ir a la pack ruta, retirar el pack tutorial, ayuda a aclarar un poco desconcertante paquete de documentación.

    • gracias por los consejos, y para el paquete de enlace tutorial 🙂
  3. 6

    Sí, uso binmode

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

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

    LÁSTIMA CAUSA DE NO UTILIZAR ESTE CÓDIGO! Se trata de un tiempo cuando yo no sabía nada mejor.

    Se podría argumentar que todavía no, pero se reproduce aquí para mostrar que puede controlar el orden de los bytes, incluso con muerte cerebral métodos, y porque necesito ‘fess arriba.

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

    Creo que he cometido la atrocidad de arriba en Perl 4. Fue hace mucho tiempo. Ojalá pudiera olvidarlo…

    • Estoy totalmente va a utilizar esta técnica. Yo no veo nada de malo, excepto la eficiencia. Estoy mucho más interesado en la solución de mi problema rápidamente con comprensible código que en el aprendizaje de la correcta perl manera de hacerlo. Gracias por publicar.
    • Honestamente, no veo el problema con esto. Pack puede ser más eficiente, pero esto es perfectamente un buen código. Yo uso las rutinas como esta con frecuencia en C a proceso conocido-endian datos desconocidos-endian plataformas. Excepto con cinta de enmascarar y cambios de lugar de la división, ya que C tiene fuerte escribiendo. Mismo concepto, aunque.

Dejar respuesta

Please enter your comment!
Please enter your name here