in reply to how to read binary file and give a binary output?

It's better if you can work out how to do this on your own by reading the sources mentioned above. Here is some example code, although much of it may still be confusing without doing some additional reading:

# Set the input and output filenames my $ifilename = 'file.in'; my $ofilename = $ifilename . '.bin'; # Open the files and ensure we handle them as binary data open my $ifile, '<', $ifilename or die "could not open input file $!"; open my $ofile, '>', $ofilename or die "could not open output file $!" +; binmode $ifile; binmode $ofile; # Read the binary data $_ = do { local $/; <$ifile> }; # Replace the initial bytes with zero s/^(.*?)(\x4F\xFF)/"\x0" x length($1) . $2/se; # Store the result in the output file print $ofile $_; # Tidy up close $ifile; close $ofile;

Replies are listed 'Best First'.
Re^2: how to read binary file and give a binary output?
by mr_mischief (Monsignor) on Oct 16, 2014 at 17:46 UTC

    This makes the assumption that the file fits in RAM. This is usually, but not always, a safe assumption. Things may get complicated if that's not the case. Since we're not talking about line-oriented text files read (and possibly sysread and syswrite) would be good additional reading.

    If there are fixed-length records there are ways to deal with that. If there are record terminators consistent throughout the file, there's a way to deal with that, too. See $/ for more information.

      Good point about it all having to fit into RAM. Should be relatively straightforward to read byte by byte, although looking ahead for the two byte separator would need some finagling. hmmm, how about:

      my $ifilename = 'file.in'; my $ofilename = $ifilename . '.bin'; open my $ifile, '<', $ifilename or die "could not open input file $!"; open my $ofile, '>', $ofilename or die "could not open output file $!" +; binmode $ifile; binmode $ofile; my $n = eof($ifile) ? "" : getc($ifile); while ((my $c = $n) ne "") { $n = eof($ifile) ? "" : getc($ifile); print $ofile "$c$n" eq "\x4F\xFF" .. 1 ? $c : "\x0"; } close $ifile; close $ofile;