Hi,

Thursday, October 2, 2003, 3:31:40 AM, you wrote:
JB> I have kibitzed and kaboodles all morning seeking the answer to the
JB> unpack question. I need to unpack some binary data and make sense of it.
JB> Unfortunately I am unsure how the binary for this was created. I have
JB> tried converting ascii but I am thinking (after much frustration) that I
JB> should go hex and then convert that. Has anyone had any experience in
JB> unpacking unknown binaries and making sense of them?

JB> TVMIA!

JB> --
JB> PHP General Mailing List (http://www.php.net/)
JB> To unsubscribe, visit: http://www.php.net/unsub.php


Have you tried using the unpack() function ?

If you need to dump the data to see what it looks like here is a couple of
functions that will help.

function hexDumpChar($str,$len){
        //echo 'Len '.strlen($str);
        $strlen = strlen($str);
        for($z=0;$z < $strlen;$z+=$len){
                $left = $strlen - $z;
                $jlen = ($left > $len)? $len:$left;
                for($j=$z;$j<$z+$jlen;$j++){
                        printf(" %02x",ord($str[$j]));
                }
                echo '&nbsp;&nbsp;&nbsp;&nbsp;';
                for($j=$z;$j<$z+$jlen;$j++){
                        printf(" %c",ord($str[$j]));
                }
                echo '<br>';
        }
        echo '<br>';
}
function hexDumpWord($str,$len){
        //little endian;
        for($z=0,$y=strlen($str);$z < $y;$z+=$len){
                for($j=$z;$j<$z+$len;$j+=2){
                        printf(" %02x%02x ",ord($str[$j+1]),ord($str[$j]));
                }
                echo '<br>';
        }
        echo '<br>';
}
function hexDumpDoubleWord($str,$len){
        //little endian;
        for($z=0,$y=strlen($str);$z < $y;$z+=$len){
                for($j=$z;$j<$z+$len;$j+=4){
                        printf(" 
%02x%02x%02x%02x&nbsp;&nbsp;",ord($str[$j+3]),ord($str[$j+2]),ord($str[$j+1]),ord($str[$j]));
                }
                echo '<br>';
        }
        echo '<br>';
}

to use

$str = substr($binary_data,0 256);
hexDumpChar($str,16);

will dump the first 256 bytes of data with 16 chars per line.

If the binary data is little endian and you need to extract a 2 words (word = 2
bytes) you can do something like this:
$ptr = 0;
$word1 = (ord($binary_data[$ptr+1]) << 8) | ord($binary_data[$ptr]);
$ptr +=2;
$word2 = (ord($binary_data[$ptr+1]) << 8) | ord($binary_data[$ptr]);

or
$str = substr($binary_data,0,2);
$up = unpack("vword1/vword2",$str);

will give you an array
$up['word1'] and $up['word2'];


If you don't know the format of the original data it can be a long process
undoing it :)


-- 
regards,
Tom

-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to