in reply to Re: pack/unpack woes
in thread pack/unpack woes

A little explanation of the changes, with some corrections:

C4 is the same as C C C C. It extracts 4 numbers.

$ perl -e'printf "0x%X\n", $_ for unpack "C4", "\x12\x34\x56\x78"' 0x12 0x34 0x56 0x78

But that's not what you want. You want to extract a single 32-bit unsigned integer in little-endian byte order.[1] After consulting Mini-Tutorial: Formats for Packing and Unpacking Numbers, we determine that we need L< or V for that.

$ perl -e'printf "0x%X\n", $_ for unpack "L<", "\x12\x34\x56\x78"' 0x78563412

So, what you want is

unpack( 'a4 C C Q< L< L< L< C', $ogg_head )

Note that this is only 27 bytes, not 28. The number of remaining bytes is indicated by that last field (the 27th byte), and may be a number other than one.

As hinted by the parent, Q is only available on builds of Perl with 64-bit integers (i.e. where perl -V:uvsize aka perl -Mv5.10 -MConfig -e'say $Config{uvsize}' prints 8 or more).


  1. The parent assumed big-endian order and thus used N. But the spec says little-endian byte order is used, which is repeated here.

Replies are listed 'Best First'.
Re^3: pack/unpack woes
by james289o9 (Acolyte) on Jun 14, 2022 at 22:12 UTC
    I had never read the mini tutorial that you made. After looking at that and then re-reading this comment, everything at least makes sense to me. Not only that, but it actually will help me clean up some code in other modules that ive written. Thanks.

      Also, have you seen perlpacktut?


      Give a man a fish:  <%-{-{-{-<