2

このスコープにクエリを送信して、.gif 形式のスコープからプリントスクリーン イメージを読み取ります。返されるデータはバイナリ ブロック形式です。ソケット接続と tcl を使用してこのスコープと通信しています。データを正常に読み取ることができましたが、データをローカル ファイルに書き込もうとすると、作成されたファイルには情報が含まれていないため、正しく書き込まれないようです。目的: このデータをローカル ファイルに保存または書き込むことで、後でアクセスできるようにします。

これは、TCL でタスクを実行しようとするコードの一部です。

#reading .gif data(binary block form) and writing it to a local file

fconfigure $channelid -encoding binary -translation binary ; #converts the stdin to binary data input
fconfigure $fileId -encoding binary -translation binary ; #converts the stdout to binary data output
set image [getdata $channelid "some query?"] ;# getdata proc reads the query returned data 
puts stderr $image ;#to verify what data I am reading
set filename "C:/test.gif"
set fileId [open $filename "w"]
puts -nonewline $fileId $image
close $fileId

どんな考えや助けも大歓迎です。ありがとう。

4

1 に答える 1

2

GIF データは基本的にバイナリです。書き出すときは、バイナリとして記述する必要があります。そうしないと、Tcl がテキスト データには正しいがバイナリには不適切な変換 (エンコード変換など) を適用します。これを行う最も簡単な方法は、使用している Tcl のバージョンがそれをサポートしている場合ではwbなく、そのモードで開くwことです — これは、C stdio に少し似たものにするために 8.5 で導入されました — それ以外の場合はfconfigure $fileId -translation binary、開いた後、何かを書き込む前に使用しますデータ。

Tclは常に、提示されるとすぐに処理を実行することに注意してください。fconfigureチャネルを開く前にチャネルを作成することはできません。あなたの2番目fconfigureは本当に数行早すぎると思います。グローバル変数を扱わないように、そのコードをプロシージャに変換することをお勧めします。これにより、操作の順序付けに関するあらゆる種類の問題をより簡単に検出できます。

proc copy_data {source_channel query_string target_file} {
    # -translation binary implies -encoding binary (and a few other things too)
    fconfigure $source_channel -translation binary
    set image [getdata $source_channel $query_string]
    set fileId [open $target_file "wb"]
    puts -nonewline $fileId $image
    close $fileId
}

# Invoke to do the operation from your example
copy_data $channelid "some query?" "C:/test.gif"
于 2012-10-06T07:50:45.380 に答える