作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想在 Tcl 中读取包含 ASCII 字符的文件(常规文本文件,用于我们的目的),并将其以十六进制形式逐字存储在数组中(即逐个数据字,每个数据字 32 位)。
一个示例是包含以下内容的文本文件:
ÿÿÿÿûûûûÿÿÿÿ
(在 ASCII 字符中,ÿ
= FF,û
= FB)
我想将其解析为一个数组,结果
[["FFFFFFFF"], ["FBFBFBFB"], ["FFFFFFFF"]]
我该如何实现这一目标?我似乎找不到合适的功能。
最佳答案
要获取数据,您可以使用以下内容:
set f [open theFile.txt]
set data [gets $f]
close $f
请注意,对于此类工作,我会考虑将文件作为二进制数据使用:
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)]
Tcl 的列表值是真正的一流值。关联数组不是,而是命名实体,因此我们可以在二进制扫描
中使用它们。
完成上述操作后,您可以使用以下命令在列表中查找内容:
# *Zero*-based indexing is the rule in Tcl
lindex $wordList 0
并迭代它们:
foreach item $wordList { puts $item }
如果您确实需要大写十六进制,请像这样应用string toupper
:
# Nasty type-shimmering trick!
set wordList [string toupper $wordList]
或者在 Tcl 8.6 中,您可以做这个更好的版本:
set wordList [lmap item $wordList {string toupper $item}]
但我实际上只是string toupper
,因为我在正常情况下使用了该值。
puts "[lindex $wordList 0] -> [string toupper [lindex $wordList 0]]"
关于tcl - 在Tcl中逐个数据字读取文件数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22640420/
我是一名优秀的程序员,十分优秀!