Sunday 5 April 2009

Create hex-dump of string

Однажды я упражнялся в алгоритмизации простой задачи на PHP. Вот результат (с небольшими доработками перед отправкой сюда).
/**
 * Creates hex-dump of string variable
 *
 * @param  string
 * @param  array
 * @return string
 */
function strhex($string, $options=array())
{
    static $defOptions = array(
        'width' => 16,
        'alt' => '.',
        'skipHeader' => false,
    );
    $options = array_merge($defOptions, $options);

    $string = (string)$string;

    $options['width'] = min(32, max(8, $options['width']));

    $w1 = $options['width'] - 1;
    $len = strlen($string);

    $result = $options['skipHeader'] 
        ? '' 
        : "Length: $len\n";

    $dump = $orig = '';
    for ($i = 0; $i < $len; $i++) {
        $char = $string[$i];

        $dump .= sprintf('%02x ', ord($char));
        $orig .= ($char >= ' ') ? $char : $options['alt'];

        if ($i && $i % $options['width'] == $w1) {
            $result .= "$dump| $orig\n";
            $dump = $orig = '';
        }
    }

    if (strlen($orig)) {
        $rem = str_repeat(' ', $options['width'] - strlen($orig));
        $result .= $dump . str_repeat($rem, 3) . "| $orig$rem\n";
    }

    return $result;
}


/**
 * Example
 */
$s = file_get_contents(__FILE__);

print strhex($s, array(
    'width' => 16,
    'skipHeader' => false,
));
Результат выглядит примерно так:
Length: 1274
3c 3f 0d 0a 0d 0a 2f 2a 2a 0d 0a 20 2a 20 43 72 | <?..../**.. * Cr
65 61 74 65 73 20 68 65 78 2d 64 75 6d 70 20 6f | eates hex-dump o
66 20 73 74 72 69 6e 67 20 76 61 72 69 61 62 6c | f string variabl
65 0d 0a 20 2a 0d 0a 20 2a 20 40 70 61 72 61 6d | e.. *.. * @param
20 20 73 74 72 69 6e 67 0d 0a 20 2a 20 40 70 61 |   string.. * @pa
72 61 6d 20 20 61 72 72 61 79 0d 0a 20 2a 20 40 | ram  array.. * @
72 65 74 75 72 6e 20 73 74 72 69 6e 67 0d 0a 20 | return string..

No comments:

Post a Comment