2012-01-11 10 views
1

私はヘッダー作成のPerlスクリプトを持っていますが、ほとんどの時間は大変効果的ですが、しばらくしてから問題が発生します。 CRC番号772423333 PERLパックの機能が壊れているので、私はそれの肉のすぐ下に行くでしょう。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

あなたの出力例はあなたのプログラムが出力するものではありません。あなたのプログラムはバイナリ形式で「悪い」という印をつけます(印字可能な文字であるかのように)。

これはここで動作します(一旦それを16進ダンプにパイプすると読み込めるようになります)が、私はLinux上にいます。

あなたが間違っているのは、出力ファイルハンドルにbinmodeを呼び出す必要があるということでしょう(または:rawレイヤーで開く)。 CRLF変換の改行が表示されています。 を(あなたのサンプルコードで)あなたの印刷の直前に追加すると、予想される出力が得られると思われます。 Windowsを使用して

[Unixでは、そこには改行ツーCRLF翻訳されていないので、それが動作]

+0

文字列にbinmodeをどのようにして開きますか?またはファイルに直接出力する必要がありますか? –

+0

あなたの文字列($ broken)は問題ありません。あなたのプリントは余分なキャラクターが来る場所です。あなたが書いているファイルハンドルをbinmodeする必要があります。あなたの例では、それはSTDOUTですが、あなたの実際のコードではおそらく他のもの、おそらくソケットです。 – derobert

+0

面白いことに私たちのコードはファイルハンドルに 'binmode'を持っていましたが、':raw'に置き換えられました。最終的に、バージョン化の問題のために ':raw'が削除されました。そして今、私たちはファイルハンドル上の 'binmode'の完全な丸です。 –

3

ストップ? 0D0Aは(より一般的に"\r\n"として見られる)、Windowsの行末の文字コードであり、あなたは自動的にすべての\n文字を変換し:crlfエンコーディング、とハンドル(STDOUT)に文字0A"\n")を印刷しているので、あなたはそれらを観察します配列\r\n

binmodeSTDOUTに呼び出して、このエンコーディングを無効にします。以下は、Cygwinユーティリティーの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 
関連する問題