Конвертировать HEX в ANSI в PHP

1

Я кодирую некое шестнадцатеричное средство просмотра, где пользователь вводит исполняемый файл, а страница возвращает шестнадцатеричный дамп и представление в ANSI. (на самом деле я не знаю, зачем использовать ANSI, но редактор Hex, который я использую, возвращает результат, используя это)

Что-то вроде этого:

Изображение 174551

Но мой код возвращает это:

Изображение 174551

Я не знаю, что я делаю неправильно, я пробовал другие коды, и он возвращал все charecters, но мне нужно сделать, чтобы некоторые байты вернули точку ".", Как вы можете видеть в печати.

Вот мой код:

 <?php

function hex2str($hex) {
    $str = '';
    for($i=0;$i<strlen($hex);$i+=2) $str .= chr(hexdec(substr($hex,$i,2)));
    return $str;
} // i found this function on internet to convert HEX to String

$nome = "apateDNS.exe";//the name of the file
$arquivo = fopen($nome, "r");
$read = fread($arquivo,filesize($nome));
$hex = bin2hex($read);// return the hex of the binary
$hehe = chunk_split(strtoupper($hex), 2, " ");// split the hex each 2 bytes
$haha = str_split($hehe, 48); //split the hex each 48 characters (32 bytes + 16 blank spaces)
foreach($haha as $linha => $i){
    echo "0000000".dechex($linha*16);
    echo " ".$i." ".hex2str($i)."<br>";
}
?>

Решено: я забыл удалить пробелы в функции...

$hex = str_replace(" ", "", $hex);
  • 0
    Вы должны заменить непечатаемые символы точкой:
  • 0
    Вы также можете заменить echo "0000000".dechex($linha*16); с echo sprintf( '%08X', $linha*16 ); , Это красивее!
Теги:
hex
ansi

1 ответ

1
Лучший ответ
function hex2str($hex) {
    $str = '';
    for($i=0;$i<strlen($hex);$i+=2) {
        $decValue = hexdec(substr($hex,$i,2));
        if($decValue < 32) {
            $str .= '.';
        } else {
            $str .= chr($decValue);
        }
    }
        return $str;
}

Для создания таблицы всех шестнадцатеричных кодов и их перевода используйте этот код:

for($x = 0; $x < 16; $x++) {
    $bin = $txt = array();
    for($y = 0; $y < 16; $y++) {        
        $num = dechex($x * 16 + $y);
        if(strlen($num) == 1) $num = '0' . $num;
        $bin[] = $num;
        $txt[] = hex2str($num);

    }
    echo (implode(' ',$bin) . '     ' . implode(' ',$txt)) . '<br/>';
}
  • 0
    Хорошо, Макс, эта функция заменяет непечатаемые символы на точку, но это не похоже на первый скриншот, некоторые байты не были преобразованы. «5А» должен быть «Z», но он стал точкой ... И еще есть несколько допросов. Любой другой совет? Ребята хххх
  • 0
    Я добавил некоторый код для создания таблицы всех шестнадцатеричных кодов и их символьного представления. Не могли бы вы предоставить скриншот вывода?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню