在Tcl中通过数据字读取文件数据字

在Tcl中通过数据字读取文件数据字,tcl,Tcl,我想在Tcl中读取一个包含ASCII字符的文件(出于我们的目的,是常规文本文件),并将其以十六进制的形式逐字存储在数组中(即逐字存储,每个数据字32位) 例如,包含以下内容的文本文件: ÿÿÿÿûûûûÿÿÿÿ (在ASCII字符中,ÿ=FF,ÿ=FB) 我想将其解析为一个数组,从而 [["FFFFFFFF"], ["FBFBFBFB"], ["FFFFFFFF"]] 我如何做到这一点?我似乎找不到合适的函数。您可以使用,如下所示: set asc "ÿÿÿÿûûûûÿÿÿÿ" se

我想在Tcl中读取一个包含ASCII字符的文件(出于我们的目的,是常规文本文件),并将其以十六进制的形式逐字存储在数组中(即逐字存储,每个数据字32位)

例如,包含以下内容的文本文件:

ÿÿÿÿûûûûÿÿÿÿ    
(在ASCII字符中,
ÿ
=FF,
ÿ
=FB)

我想将其解析为一个数组,从而

[["FFFFFFFF"], ["FBFBFBFB"], ["FFFFFFFF"]]
我如何做到这一点?我似乎找不到合适的函数。

您可以使用,如下所示:

set asc "ÿÿÿÿûûûûÿÿÿÿ"
set result ""
set bytearray [list]
set count 0

foreach l [split $asc ""] {
    append result [format %x [scan $l %c]] ;# %c for reading character as unicode
                                            # %x for converting into hex
    incr count
    if {$count == 4} {
        set count 0
        lappend bytearray [string toupper $result]
        set result ""
    }
}

puts $bytearray
# => FFFFFFFF FBFBFBFB FFFFFFFF
阅读 要获取数据,请使用以下方法:

set f [open theFile.txt]
set data [gets $f]
close $f
请注意,对于这种工作,我会考虑将文件作为二进制数据来处理:< /P>
set f [open theFile.bin "rb"]
set data [read $f 12]
close $f
解析/转换 将数据解释为十六进制序列(小写)很容易:

binary scan $data H8H8H8 word(1) word(2) word(3)
将值存储到名为
word
的关联数组中(具有索引
1
2
3
)。如果您想要一些类似于您在其他语言中习惯的东西,那么您可以转换为如下所示的Tcl列表:

set wordList [list $word(1) $word(2) $word(3)]
# Nasty type-shimmering trick!
set wordList [string toupper $wordList]
Tcl的列表值是真正的一流值。关联数组不是,而是命名实体,因此我们可以在
二进制扫描中使用它们

使用 完成上述操作后,您可以在列表中查找以下内容:

# *Zero*-based indexing is the rule in Tcl
lindex $wordList 0
并使用以下命令对其进行迭代:

foreach item $wordList { puts $item }
案例转换 如果您确实需要大写十六进制,请像这样应用
string-toupper

set wordList [list $word(1) $word(2) $word(3)]
# Nasty type-shimmering trick!
set wordList [string toupper $wordList]
或者,在Tcl 8.6中,您可以实现以下更好的版本:

set wordList [lmap item $wordList {string toupper $item}]
但是我实际上只是
字符串toupper
,因为我在正常情况下使用了这个值

puts "[lindex $wordList 0] -> [string toupper [lindex $wordList 0]]"