1

私はヘッダー作成用の 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ですか?

4

2 に答える 2

4

出力例は、プログラムが出力するものではありません。あなたのプログラムは、それを16進数ではなくバイナリで(印刷可能な文字であるかのように)「悪い」と出力します。

ここでは機能しますが (16 進ダンパーにパイプすると、読み取れるようになります)、Linux を使用しています。

ほとんどの場合、間違っているのは、出力ファイルハンドルを呼び出す必要があることです(または、レイヤーbinmodeで開く必要があります)。:raw改行から CRLF への変換が表示されます。binmode *STDOUT;(サンプルコードで)印刷の直前に追加すると、期待される出力が得られると思います。

[ Unix では、改行から CRLF への変換がないため、機能します]

于 2012-01-11T21:32:38.377 に答える
3

Windows の使用を停止しますか? 0D0Aは、Windows の行末の文字コード (より一般的には) であり、文字( ) をエンコーディングでハンドル ( )に出力し"\r\n"ているため、それらを観察できます。これにより、任意の文字がシーケンス に自動的に変換されます。0A"\n"STDOUT:crlf\n\r\n

このエンコーディングを無効にするには、電話binmodeしてください。STDOUTCygwin ユーティリティを使用して perl の MSWin32 ビルドを使用したビューを次に示します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
于 2012-01-11T21:34:53.957 に答える