2009-07-15 12 views
0

私はBINARYファイルをASCIIファイルに変換/操作する方法は?

は貸し付けは、配列またはテキストファイルに4バイトのバイナリファイルからテキスト文字を取るための方法を探しています私の入力ファイルは次のとおりです。

00000000 2e 00 00 00 01 00 00 00 02 00 00 00 03 00 00 00 |................| 
00000010 04 00 00 00 05 00 00 00 06 00 00 00 07 00 00 00 |................| 
00000020 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 
00000030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 
* 
00000070 00 00 00 00 00 00 00 00       |........| 
00000078 

そして、私の所望の出力は次のようになります。

46,1,2,3,4,5,6,7,8,9,0,0... 

出力には、TEXTファイルまたは配列を使用できます。

私はパック/アンパック機能がここに役立つかもしれないが、私はそれらを適切に使用する方法を見つけ出すことができなかった、

例いいだろうということに気づきます。

答えて

9

使用unpack

local $/; 
@_=unpack("V*", <>); 

はあなたの配列を取得します。非効率的な(巨大ファイルを試してはいけない)例:

perl -e 'local$/;print join(",",map{sprintf("%d",$_)}unpack("V*",<>))' thebinaryfile 
+0

ありがとうございました!私はそれをテストし、それは仕事をした!とてもエレガントでシンプル! – YoDar

+2

「V」テンプレートは、入力バイトを32ビットのリトルエンディアンの「長い」数字として正確に解釈すると言わなければなりません。あなたがやっていることに応じて、 'L'がもっと適切かもしれません。しかし、詳細については、 'perldoc -f pack'を参照してください。 – dlowe

1

答えは、あなたがASCII文字とみなすものによって決まります。 128以下の文字は技術的にはASCII文字ですが、通常はテキストファイル内にある文字を意味していると仮定しています。その場合には、これを試してみてください。

#!/usr/bin/perl 

use strict; 
use warnings; 
use bytes; 

$/ = \1024; #read 1k at a time 
while (<>) { 
    for my $char (split //) { 
     my $ord = ord $char; 
     if ($char > 31 and $char < 127 or $char =~ /\r\n\t/) { 
      print "$ord," 
     } 
    } 
} 
0
od -t d4 -v <filename> 
関連する問題