我通过向此范围发送查询,从.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
任何想法或帮助将不胜感激。感谢。
答案 0 :(得分: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"