Read pack. Likely you're using the H2 template and it seems you want to use the h2 template instead.
| [reply] [d/l] [select] |
Sounds like you chose the wrong one of unpack('V', $packed), unpack('N', $packed) and unpack('L', $packed).
printf "%08X\n", unpack 'N', "\x12\x34\x56\x78"; # 12345678
printf "%08X\n", unpack 'V', "\x12\x34\x56\x78"; # 78563412
| [reply] [d/l] [select] |
my $cdrdata = unpack "N*", substr($data, BLOCKHDR+BLOCKDATA, CDRLENGT
+H);
Its look not convert all the hex values, might be my code is wrong..
| [reply] [d/l] |
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:
my $foo = reverse(unpack('h*', "\x21\x43\x65\x87\x09\xBA\xDC")), "\n
+" ;
which sets $foo to the string: 1234567890abcd
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 :-)
| [reply] [d/l] [select] |
No idea. I don't know the format of your data.
| [reply] |
$ perl -wle 'print join "", reverse unpack("(A2)*", "1234567890")'
9078563412
Or you could scalar reverse the binary data before unpacking it, that should give the same result. | [reply] [d/l] [select] |