1

私は、ムービーファイルのトレースを取得してバイナリファイルに変換するtclスクリプトを使用しています。このバイナリファイルは、ns-2のアプリケーションエージェントによってさらに使用されます。ムービーファイルのトレースをバイナリファイルに変換するスクリプトのコードスニペットは次のとおりです。

set original_file_name Verbose_Silence_of_the_Lambs_VBR_H263.dat
set trace_file_name video.dat
set original_file_id [open $original_file_name r]
set trace_file_id [open $trace_file_name w]
set last_time 0
while {[eof $original_file_id] == 0} {
    gets $original_file_id current_line
    if {[string length $current_line] == 0 ||
    [string compare [string index $current_line 0] "#"] == 0} {
       continue  
    }

    scan $current_line "%d%s%d" next_time type length
    set time [expr 1000*($next_time-$last_time)]
    set last_time $next_time
    puts -nonewline $trace_file_id [binary format "II" $time $length]
}
close $original_file_id
close $trace_file_id 

しかし、この作成されたvideo.datファイルをアプリケーションエージェントが使用するトラフィック生成にさらに使用すると、次のエラーが発生しました。

Bad file siz in video.dat
Segmenatation fault

親切にこれで戦利品を持っています。コード内のバイナリ形式「II」の意味は何ですか。tcl-binary(n)のドキュメントに記載されていないか、古くて現在サポートされていないためです。

4

1 に答える 1

1

問題はおそらく、ファイルをバイナリ モードで開いていないことです。

変化する

set trace_file_id [open $trace_file_name w]

set trace_file_id [open $trace_file_name wb]

それ以外の場合、Tcl は出力を変更します。たとえば、Windowsでは置き換え\nられます。\r\n(バイト値 > 127 の場合、Unicode コード ポイントとして扱われ、システム エンコーディングに変換されるため、バイナリ全体が台無しになります) テキスト ファイルではこのようなことは問題ありませんが、バイナリ ファイルでは問題が発生します。

幸いなことに、それを修正するために必要な文字は 1 つだけbです。open

編集: Tclの変更リストを調べたところ、bopenの修飾子が8.5で追加されました。私は通常 8.5 または 8.6 しか使用しないため、古いバージョンの Tcl を使用している場合は、開いた後に次の行を追加します。

fconfigure $trace_file_id -translation binary

修飾子はそのbための単なるショートカットです。

于 2013-04-09T18:38:24.957 に答える