我是tcl的新手,我需要读取二进制文件并比较第一个和最后一个字节的数据,但我发现二进制扫描对我来说不起作用(甚至是示例(
这是的片段
set fp [open $temp_file_name]
defer { close $fp }
fconfigure $fp -translation binary
# ...
seek $fp 0
set m [binary scan [read $fp 1] h* v]
puts $v
# can't read "v": no such variable
# m is 0
以为例
> puts [binary scan abcdefg s3s first second]
> puts $first
## can't read "first": no such variable
> puts $second
## can't read "second": no such variable
我做错了什么?
binary scan
的结果是已满足的格式组的数量。如果我们考虑这种情况:
binary scan abcdefg s3s first second
这样做的结果是1
,因为有足够的字节只满足第一个格式组s3
。这消耗了六个字节(三个16位的小端数量,用完了abcdef
(。没有足够的数据来满足以下s
;需要另一个字节。
% info patchlevel
8.6.10
% puts [binary scan abcdefg s3s first second]
1
% puts $first
25185 25699 26213
% puts $second
can't read "second": no such variable
使用其他代码:
set m [binary scan [read $fp 1] h* v]
这将从流中读取一个字节,转换为小端十六进制数字(我不太喜欢h
转换;H
对我来说似乎更明智,尤其是对于单个字节(,并将所有这些十六进制字符存储在变量v
中。如果从流中读取了任何内容,则应返回1。
我完全不知道binary scan
为什么不适合你。它似乎根本没有按照记录在案的行为运作。仔细检查一下,您没有意外替换::binary
或::tcl::binary::scan
(这是binary scan
的默认实现(命令,是吗?
由于事情的表现严重不符合规范,很难建议如何解决这个问题。