Perl конвертирует двоичный поток в гекс - PullRequest
3 голосов
/ 24 ноября 2010

Проблема, с которой я сталкиваюсь, заключается в том, что у меня есть сценарий Perl, считывающий данные (PE Executable) через STDIN, и поток содержит разделитель строки «0A», преобразование в hex пропускает его. Затем, когда я конвертирую шестнадцатеричные данные обратно, они повреждены (отсутствует 0A в шестнадцатеричном формате). Итак, как я могу определить версию Windows "0A" для строки в Perl?

Примечание: ОС Linux (Perl) читает Windows PE

!usr/bin/perl

while($line = <STDIN>)
{
    chomp($line);
    @bytes = split //, $line;
    foreach (@bytes)
    {
        printf "%02lx", ord $_;
    }
}

Пример использования:

[root@mybox test]# cat test.exe | perl encoder.pl > output

Ответы [ 2 ]

6 голосов
/ 24 ноября 2010

В вашем цикле вы запускаете chomp в каждой строке ввода. Это удаляет любое значение, которое в настоящее время находится в $/ с конца вашей строки. Скорее всего, это 0x0a, и это то, где значение идет. Попробуйте удалить chomp($line) из вашего цикла.

Как правило, использование строчно-ориентированного чтения не имеет смысла для двоичных файлов, которые сами не ориентированы на строки. Вы должны взглянуть на функцию нижнего уровня read, которая позволяет вам читать блок байтов из файла, не заботясь о том, что это за байты. Затем вы можете обрабатывать ваши данные в виде блоков вместо строк.

1 голос
/ 08 апреля 2011
#With split
cat magic.exe | perl -e 'print join("", map { sprintf("\\x%02x", ord($_)) } split(//, join("", <STDIN>)))' > hex_encoded_binary

#With pack
cat magic.exe| perl -e 'print join("", map { "\\x" . $_ } unpack("H*", join("", <STDIN>)) =~ /.{2}/gs)' > hex_encoded_binary
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...