Ficheros Binarios

La función read

La función read FILEHANDLE,SCALAR,LENGTH,OFFSET lee desde el fichero FILEHANDLE un número de LENGTH caracteres en la variable SCALAR. Devuelve el número de caracteres leídos, 0 si es el final de fichero y undef si hubo un error. Es posible indicar que el fichero usado es binario mediante la función binmode (línea 7 en el ejemplo que sigue):
lhp@nereida:~/Lperl/src$ cat -n binaryfiles.pl
 1  #!/usr/bin/perl -w
 2  use strict;
 3  my $buffer = "";
 4  my $file = shift;
 5
 6  open(FILE, "< $file");
 7  binmode(FILE);
 8  my $s = -s $file;
 9  read(FILE, $buffer, $s);
10  close(FILE);
11
12  open(FILE, "> $file.sal");
13  syswrite(FILE, $buffer, $s);
14  close(FILE);
15
16  my $c;
17  foreach (split(//, $buffer)) {
18    printf("%02x ", ord($_));
19    print "\n" unless ++$c % 20;
20  }
21  print "\n";
La salida de la ejecución nos permite comprobar que la copia de un ejecutable a.out preserva el formato binario:

lhp@nereida:~/Lperl/src$ ./binaryfiles.pl a.out | head -3
7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 02 00 03 00
01 00 00 00 e0 82 04 08 34 00 00 00 f4 0d 00 00 00 00 00 00
34 00 20 00 07 00 28 00 22 00 1f 00 06 00 00 00 34 00 00 00
lhp@nereida:~/Lperl/src$ ls -ltr | tail -2
-rwxr-xr-x   1 lhp lhp   341 2006-06-21 18:00 binaryfiles.pl
-rw-r--r--   1 lhp lhp  6969 2006-06-21 18:02 a.out.sal
lhp@nereida:~/Lperl/src$ chmod a+x a.out.sal; ./a.out.sal
hello world!
lhp@nereida:~/Lperl/src$ ./a.out
hello world!
lhp@nereida:~/Lperl/src$

La función syswrite

La función syswrite (línea 13) tiene el siguiente formato:

     syswrite FILEHANDLE,SCALAR,LENGTH,OFFSET
     syswrite FILEHANDLE,SCALAR,LENGTH
     syswrite FILEHANDLE,SCALAR

Intenta escribir LENGTH bytes de SCALAR en FILEHANDLE saltándose los buffers de E/S. Si no se especifica LENGTH se escribe todo SCALAR.



Subsecciones
Casiano Rodríguez León
2009-10-04