in reply to Re: How to reverse for each 2 character ?
in thread How to reverse for each 2 character ?

is it right command ?

my $cdrdata = unpack "N*", substr($data, BLOCKHDR+BLOCKDATA, CDRLENGT +H);

Its look not convert all the hex values, might be my code is wrong..

Replies are listed 'Best First'.
Re^3: How to reverse for each 2 character ?
by gone2015 (Deacon) on Aug 29, 2008 at 08:47 UTC

    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 :-)

Re^3: How to reverse for each 2 character ?
by ikegami (Patriarch) on Aug 29, 2008 at 08:09 UTC
    No idea. I don't know the format of your data.