Tcl二进制扫描未设置字节



我是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的默认实现(命令,是吗?

由于事情的表现严重不符合规范,很难建议如何解决这个问题。

最新更新