Chas. Owens wrote:
On Thu, May 7, 2009 at 05:45, Raymond Wan <rwan.w...@gmail.com> wrote:
I would like to write binary values to disk (as well as read them) but don't
know how to do it. In C-speak, something like this:
unsigned int foo = 42;
fwrite (&foo, sizeof (unsigned int), 1, stdout);
I think the answer involves something with pack and unpack, but I'm
completely lost as I have no experience with either. The closest I got was
my $decimal_number = 42;
my $binary_number = unpack("B32", pack("N", $decimal_number));
print "Decimal number " . $decimal_number . " is " . $binary_number .
" in binary.\n\n";
which I've taken from
http://www.linuxconfig.org/Perl_Programming_Tutorial. This doesn't
work since it's printing the number "42" in text binary; but
I think it is close... Or I might be barking up the wrong tree and I should
be thinking about "fprintf" somehow...
Does anyone have any ideas? Thank you!
You use pack to create a binary value and unpack to read a binary
value. So, to write a file containing three 32 bit integers you say
#!/usr/bin/perl
use strict;
use warnings;
my $file = "/tmp/3ints";
#the :raw here tells Perl that the file will
#be binary
open my $fh, ">:raw", $file
or die "could not open $file: $!\n";
print $fh pack "lll", 1230, -897, 20;
close $fh or die "could not close $file: $!\n";
my $size = (stat $file)[7];
print "$file contains $size bytes\n";
And then to read the file, you say:
#!/usr/bin/perl
use strict;
use warnings;
my $file = "/tmp/3ints";
my $size = 12;
#the :raw here tells Perl that the file will
#be binary
open my $fh, "<:raw", $file
or die "could not open $file: $!\n";
sysread($fh, my $buffer, $size) == $size
or die "did not read $size bytes from $file\n";
Shouldn't that be either:
sysopen ...
sysread ...
Or:
open ...
read ...
?
close $fh or die "could not close $file: $!\n";
print "the ints are ", join(", ", unpack "lll", $buffer), "\n";
John
--
Those people who think they know everything are a great
annoyance to those of us who do. -- Isaac Asimov
--
To unsubscribe, e-mail: beginners-unsubscr...@perl.org
For additional commands, e-mail: beginners-h...@perl.org
http://learn.perl.org/