1

tcpフローファイルからhttpヘッダ以外の内容を抽出したい 内容は以下のようなもので、^Mが2つ揃うとhttpヘッダが終了する

HTTP/1.1 200 OK^M 
Last-Modified: Sat, 20 Mar 2010 09:43:12 GMT^M 
Content-Type: video/x-flv^M 
Date: Wed, 24 Oct 2012 14:34:13 GMT^M 
Expires: Wed, 24 Oct 2012 14:34:13 GMT^M 
Cache-Control: private, max-age=22124^M 
Accept-Ranges: bytes^M 
Content-Length: 29833281^M 
Connection: close^M 
X-Content-Type-Options: nosniff^M 
Server: gvs 1.0^M 
^M 
FLV^A^E^@^@^@   ^@^@^@^@^R^@^CK^@^@^@^@^@^@^@^B^@ 
onMetaData^H^@^@^@^O^@^Hduration^@@i<97> 
=p£×^@  starttime^@^@^@^@^@^@^@^@^@^@^Mtotalduration^@@i<97>

抽出用の私のコードは次のとおりです。extract.pl < tcp.flow を実行しますが、ループが無限にあるようです。コードの何が問題なのですか? ありがとう!

#!/usr/bin/perl 
$start=0; 
$data=""; 
while(<STDIN>) 
{ 
    if ( $start eq 0 && $_ =~ /^\r\n/) { $start = 1; } 
    elsif ( $start eq 1 ) { $data = $data . $_; } 
} 
open(FH, ">sample.flv"); 
print FH $data; 
close(FH);
4

2 に答える 2

1

データを読み取る前に STDIN を呼び出しbinmode()ます。ファイルの内容がファイルの読み取りに干渉している可能性があります。データを書き込む前に、FH でも使用する必要があります。HTH

于 2012-10-24T20:44:26.907 に答える
1

これはワンライナーです。ただし、無限ループの理由はわかりません。

perl -00 -lne '$i++ and print' file > sample.flv

デパースさ​​れたものは次のようになります。

>perl -MO=Deparse -00 -lne '$i++ and print' input.txt
BEGIN { $/ = ""; $\ = "\n\n"; }        # from -l and -00
LINE: while (defined($_ = <ARGV>)) {   # from -n
    chomp $_;                          # from -l, removes "\n\n" now
    print $_ if $i++;                  # skips the first line
}
-e syntax OK

最初にファイルをクリーンアップする必要がある場合は、

perl -pi -le 's/[\r\n]+$//' input.txt
于 2012-10-24T21:33:40.370 に答える