Beefy Boxes and Bandwidth Generously Provided by pair Networks
Clear questions and runnable code
get the best and fastest answer

Re: PERL Binary Data Handling

by Illuminatus (Curate)
on Oct 05, 2012 at 21:07 UTC ( #997549=note: print w/replies, xml ) Need Help??

in reply to PERL Binary Data Handling

First of all, I want to congratulate you, as a newbie, for utilizing code tags :).

  1. While you may want 33 bits worth of data, when you write it, it will be 40-bits worth of data. You would be best served by explicitly defining all 40 bits in your pack operation
  2. pack takes string parameters. You're reading in a binary value, and passing that as the argument to pack. To do what you want, you should my $str = unpack ("b32", $buff); and then use $str as the second arg
  3. You probably want to use syswrite to do your output, rather than print


Replies are listed 'Best First'.
Re^2: PERL Binary Data Handling
by ashes3d (Initiate) on Oct 05, 2012 at 23:23 UTC

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


    Output should be:


    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:


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


    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)

      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;


      $ 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?

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

How do I use this? | Other CB clients
Other Users?
Others musing on the Monastery: (3)
As of 2022-01-19 14:50 GMT
Find Nodes?
    Voting Booth?
    In 2022, my preferred method to securely store passwords is:

    Results (55 votes). Check out past polls.