Функция Perl Pack не работает? - PullRequest
1 голос
/ 12 января 2012

У меня есть Perl-скрипт для создания заголовков, и он прекрасно работает большую часть времени, но время от времени что-то ломается. Я пойду прямо к сути, учитывая номер CRC 772423333, что функция пакета PERL прерывается.

my $dec = 772423333;
my $broken = pack("N", $dec);
print "Good:\t", uc(sprintf("%x", $dec)), "\nBad:\t$broken"; # eg. 2E0D0A3EA5

Простите, что не знаете, как напечатать читаемый HEX, но это то, что он возвращает.

Good:   2E0A3EA5
Bad:    2E0D0A3EA5

Как мне удалить 0D?

Ответы [ 2 ]

4 голосов
/ 12 января 2012

Ваш пример вывода не тот, что печатает ваша программа.Ваша программа выводит «плохо» это в двоичном формате (как будто это печатные символы, хотя это не так), а не в шестнадцатеричном формате.

Это работает здесь (как только я передаю его в шестнадцатеричный дампер, так что я могу читатьэто), но я работаю в Linux.

Скорее всего, вы ошибаетесь в том, что вам нужно вызвать binmode на дескрипторе выходного файла (или, альтернативно, открыть его со слоем :raw));Вы видите перевод новой строки в CRLF.Если вы добавите binmode *STDOUT; непосредственно перед печатью (в вашем примере кода), я подозреваю, что вы получите ожидаемый результат.

[В Unix нет перевода с новой строки в CRLF, поэтому он работает]

3 голосов
/ 12 января 2012

Прекратить использование Windows?0D0A - это коды символов конца строки Windows (чаще всего обозначаемые как "\r\n"), и вы наблюдаете их, потому что печатаете символ 0A ("\n") в дескриптор (STDOUT) с помощью :crlf кодировка, которая автоматически преобразует любые \n символы в последовательность \r\n.

. Вызовите binmode на STDOUT, чтобы отключить эту кодировку.Вот пример использования сборки Perl для MSWin32 с утилитой Cygwin od:

$ winperl -e 'print pack("N",772423333)' | od -c
0000000   .  \r  \n   > 245
0000005

$ winperl -e 'binmode STDOUT; print pack("N",772423333)' | od -c
0000000   .  \n   > 245
0000004
...