Perl конвертирует двоичный поток в шестнадцатеричный

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

Примечание. ОС Linux (Perl) читает среду предустановки Windows.

!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

person ekronnenburg    schedule 23.11.2010    source источник


Ответы (1)


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

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

person Eric Strom    schedule 23.11.2010
comment
Вау, это неловко. Я сразу же бросился возиться с binmode() и даже не увидел chomp. - person Jim Davis; 24.11.2010
comment
Кроме того, вы обнаружите, что unpack('H*', $binary_string) намного эффективнее, чем split и printf '%02x'. - person cjm; 24.11.2010
comment
внес изменения#!/usr/bin/perl binmode(STDIN); в то время как (‹STDIN›) { #print $_; push(@bytes,$_); } foreach (@bytes) { printf %02lx, ord $_; } - person ekronnenburg; 24.11.2010
comment
С изменением кода на binmod + удаление chomp поток ломается - person ekronnenburg; 24.11.2010
comment
Проверенный chomp удаляет 0a из потока кодирования, однако мне нужно вставить следующие символы '\x' в шестнадцатеричный набор, например, 0d0d0a24 будет \x0d\x0d\x0a\x24, любые предложения, как это сделать, будут оценены. - person ekronnenburg; 24.11.2010
comment
@ekronnenburg =› есть несколько способов сделать это, что именно вы пытаетесь сделать? - person Eric Strom; 24.11.2010