develooper Front page | perl.perl6.language | Postings from September 2000

Re: pack/unpack is damn unperlish. Explain them as Perl.

Thread Previous | Thread Next
From:
Buddha Buck
Date:
September 19, 2000 08:12
Subject:
Re: pack/unpack is damn unperlish. Explain them as Perl.
Message ID:
4.3.2.7.0.20000919103744.00d0cd40@armstrong.cse.buffalo.edu
At 07:29 AM 9/19/00 -0700, Dave Storrs wrote:
>         I guess, if I had to write an explanation of pack/unpack based on
>my limited understanding, it would be something like:
>
>         "Unpack takes binary data in some particular format and
>disassembles it, assigning various pieces of it to variables according to
>formatting that you supply.  Pack does the opposite, using your supplied
>formatting to crunch Perl scalar variables into binary data that is
>represented in some specific way.  The binary data used by (un)pack will
>belong to exactly one type of C numeric variable, meaning that it will be
>limited in what kinds of numbers it can store and how it will represent
>them."
>
>         Is this definition completely off-base?

I think you are on track, but I would probably have defined it the other 
way around:

"The perl function pack() takes Perl values and converts them to a compact 
binary representation based on a user-specified template.  This is useful 
for communicating with external data formats that expect data to be in a 
particular binary format that is not native to perl.  The perl function 
unpack() takes a compact binary representation of data and converts it to 
Perl values based on a user-specified template.  Pack() and unpack() are 
inverse-functions of each other: if used with the same template, unpack can 
be used to recover data that has been packed.

Example:

$Tudpheader = "nnnn"; # source, destination, length, checksum
$Tudppseudoheader = "NNxcn"; # source IP, dest IP, protocol (must be 17), 
length

$udplength = length($data)+8;

$udpcheck = (pack $Tpseudoheader, $sip,$dip,17, $udplength)
             . $(pack $Tudbheader,$sport,$dport,$udplength, 0)
             . $data;

$checksum = udpchecksum($udpcheck);

$udppacket = (pack $Tudbheader,$sport,$dport,$udplength,$checksum) . $data

"

>                                 Dave


Thread Previous | Thread Next


nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About