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 会对它应用一些转换(例如,编码转换),这些转换对于文本数据是正确的,但对于二进制数据是错误的。最简单的方法是使用该wb模式打开,而不是w您使用的 Tcl 版本是否支持该模式——它是在 8.5 中引入的,以使事情更像 C stdio——但否则fconfigure $fileId -translation binary在打开之后和编写任何内容之前使用数据。

请注意,Tcl总是按照呈现的方式立即对事物进行操作;在打开它之前你不能fconfigure打开它。我猜你的第二个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 回答