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).
In reply to Re^2: pack/unpack woes
by ikegami
in thread pack/unpack woes
by james289o9
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |