Beefy Boxes and Bandwidth Generously Provided by pair Networks
Come for the quick hacks, stay for the epiphanies.
 
PerlMonks  

Re^2: PERL Binary Data Handling

by ashes3d (Initiate)
on Oct 05, 2012 at 23:23 UTC ( [id://997554]=note: print w/replies, xml ) Need Help??


in reply to Re: PERL Binary Data Handling
in thread PERL Binary Data Handling

Thank you both for the response! To elaborate on my question, let's assume that the input file contains a binary number of:

"0101_1111_1111_0000_0111_0000_1111_1010"

Output should be:

"1_0101_1111_1111_0000_0111_0000_1111_1010"

This is purely binary input. I only added the "_" for readability. I understand that we cannot write a file on non byte boundaries. So if I would always have 7 extra bits when this is written to the file. This would mean that my output file will look like:

"0000_0001_0101_1111_1111_0000_0111_0000_1111_1010"

When I run the code below, I get an output of:

"0000_0001_0000_0000_0000_0000_0000_0000_0000_0000"

I think I am still misusing the pack command. What am I missing? Code below:

#!/usr/bin/perl my $inputfile = $ARGV[0]; my $outputfile = $ARGV[1]; my $buff = ""; my $mybuff = ""; open (PARSER_FILE, $inputfile) or die "Couldn't open $inputfile for reading"; binmode(PARSER_FILE); open (OUT_FILE, ">", $outputfile) or die "Couldn't open $outputfile for writing"; binmode(OUT_FILE); read(PARSER_FILE, $buff, 4); $outbuff = unpack("b32", $buff); syswrite OUT_FILE, pack("b33", 1, $outbuff); close(OUT_FILE); close(PARSER_FILE)

Replies are listed 'Best First'.
Re^3: PERL Binary Data Handling
by kcott (Archbishop) on Oct 06, 2012 at 07:36 UTC

    G'day ashes3d,

    Welcome to the monastery.

    Using the data you've provided, here's a blow-by-blow account of how to achieve what I believe you're after.

    #!/usr/bin/env perl use 5.010; use strict; use warnings; # Simulate the 4 bytes of input binary data (i.e. from input file) my $in_data = pack 'B32' => '01011111111100000111000011111010'; # Create new leading byte with binary value of 1 my $lead_byte = pack 'B8' => '00000001'; # Concatenate leading and input bitstrings my $concat_bitstrings = unpack('B8', $lead_byte) . unpack('B32', $in_d +ata); # Create new data with 5 (1+4) bytes my $out_data = pack 'B40' => $concat_bitstrings; # Test it worked # Converting "0101_1111_1111_0000_0111_0000_1111_1010" # and "0000_0001_0101_1111_1111_0000_0111_0000_1111_1010" # to HEX format for ease of visualising/checking my $in_hex = '5ff070fa'; my $out_hex = '01' . $in_hex; # Print expected and actual results say 'Input'; say 'EXPECT: ', $in_hex; say 'GOT: ', unpack 'H*' => $in_data; say 'Output'; say 'EXPECT: ', $out_hex; say 'GOT: ', unpack 'H*' => $out_data;

    Output:

    $ pm_bin_32_40.pl Input EXPECT: 5ff070fa GOT: 5ff070fa Output EXPECT: 015ff070fa GOT: 015ff070fa

    I'll assume you've found the doco for pack and unpack. There's also a tutorial you may not be aware of: perlpacktut.

    -- Ken

      Thank you Ken! That is what I was trying to get to. I was forgetting the "join" step. Actually, the first anonymous poster mentioned it. You guys Rock!

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://997554]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others sharing their wisdom with the Monastery: (5)
As of 2024-03-28 16:35 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found