unpack "N", $string will take the first 4 bytes of $string and return a 32-bit integer, taking the 4 bytes in "Network" order -- the first byte is the most significant, and then in descending order (ie big-endian).
unpack, "N*", $string will repeat the process of extracting 32-bit integers to consume all of $string, and returns a list of those integers.
my $cdrdata = unpack "N*", $string will unpack as many 32-bit integers as there are in $string, and then set $cdrdata to the first of them. Which, on the face of it, isn't what you wanted.
If the input is little-endian, you need unpack "V", ....
If the input is not 32-bit integers in one or other order, you need something more general, such as:
which sets $foo to the string: 1234567890abcdmy $foo = reverse(unpack('h*', "\x21\x43\x65\x87\x09\xBA\xDC")), "\n +" ;
You can, of course, replace the * in h* by a number to extract a fixed number of bytes. So '(h6)*' would extract six bytes at a time, as many times as it could.
I'll leave why this works as homework :-)
In reply to Re^3: How to reverse for each 2 character ?
by gone2015
in thread How to reverse for each 2 character ?
by bh_perl
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |