Fisher Tom
Fisher Tom

Reputation: 1

how to print the result from pack function?

I like to verify what pack does. I have the following code to give it a try.

$bits = pack 'N','134744072';

how to print bits ?

I did the following:

printf ("bits = %032b \n", $bits);  

but it does not work.

Thanks !!

Upvotes: 0

Views: 259

Answers (2)

Grant McLean
Grant McLean

Reputation: 6998

The Devel::Peek module (which comes with Perl) allows you to examine Perl's representation of the variable. This is probably more useful than just a raw print when you're dealing with binary data rather than printable character strings.

#!/usr/bin/perl

use strict;
use warnings;

use Devel::Peek qw(Dump);

my $bits = pack 'N','134744072';

Dump($bits);

Which produces output like this:

SV = PV(0xaedb20) at 0xb15650
  REFCNT = 1
  FLAGS = (POK,pPOK)
  PV = 0xb06630 "\10\10\10\10"\0
  CUR = 4
  LEN = 10

The 'SV' at the beginning indicates that this is a dump of a 'scalar value' (as opposed to say an array or a hash value).

The 'SV = PV' indicates that this scalar contains a string of bytes (as opposed to say an integer or floating point value).

The 'PV = 0xb06630' is the pointer to where those bytes are located.

The "\10\10\10\10"\0 is probably the bit you're interested in. The double quoted string represents the bytes making up the contents of this string. Inside the string, you would typically see the bytes interpreted as if they were ASCII, so the byte 65 decimal would appear as 'A'. All non-printable characters are displayed in octal with a preceding \.

So your $bits variable contains 4 bytes, each octal '10' which is hex 0x08.

The LEN and CUR are telling you that Perl allocated 10 bytes of storage and is currently using 4 of them (so length($bits) would return 4).

Upvotes: 1

ikegami
ikegami

Reputation: 385917

If you want the binary representation of a number, use

my $num = 134744072;
printf("bits = %032b\n", $num); 

If you want the binary representation of a string of bytes, use

my $bytes = pack('N', 134744072);
printf("bits = %s\n", unpack('B*', $bytes)); 

Upvotes: 3

Related Questions