TCL:格式,二进制格式,扫描和二进制扫描命令有什么区别?

时间:2013-12-20 09:06:49

标签: tcl

任何人都可以向我解释scanbinary scan之间的差异。

formatbinary format

我对二进制命令感到困惑。

3 个答案:

答案 0 :(得分:2)

要理解操作二进制数据和字符串数据的命令集之间的区别,您必须了解这两种数据之间的区别。

在Tcl中,与许多(大多数?)高级语言一样,字符串相当抽象 - 也就是说,它们是用相当高级的术语描述的。特别是在Tcl中,字符串被定义为具有以下属性:

  • 它们包含Unicode曲目中的字符。
  • Tcl运行时提供了一组标准命令来操作字符串 - 例如索引,搜索,追加,提取子字符串等。

请注意,此定义中遗漏了许多内容:

  • 存储这些Unicode字符的编码。
  • 它们的确切存储方式(NUL - 已终止的数组?unsigned long的链接列表?还有其它内容?)。

(从更有趣的角度来看,Tcl能够透明地改变它管理的字符串的基础表示 - 在UTF-8UTF-16编码序列之间。但是我们在这里谈论{ {3}}和其他实现(例如the reference Tcl implementation)可以完全自由地做其他事情。)

使用相同的方法来操纵Tcl解释器中的所有其他类型的数据。比如,使用本机平台“整数”(大致“在C中”)存储整数,但如果算术运算即将溢出平台大小的结果,它们将被透明地升级为任意大小的整数。

只要您不离开Tcl解释器的舒适世界,您应该了解它所管理的数据类型。但现在有外面的世界。在其中,不存在作为Tcl字符串的抽象概念。比如说,如果你需要通过网络套接字或通过使用文件或任何其他类型的媒体与其他程序通信,你必须降低到原始字节的确切布局级别由Jacl"wire protocols"描述或适用于您的情况的任何内容。这就是“二进制文件”发挥作用的地方:它们允许您精确指定数据的布局方式,以便将其准备好传输到外部世界或从中消耗 - binary format使这些“二进制文件”和binary scan读取它们。

请注意,某些用于处理外部世界的Tcl命令“默认为智能” - 例如,默认情况下打开文件的open命令假设它们是文本的并且使用默认系统编码进行编码(从广义上讲,它是从环境中推断出来的。然后,您可以使用chan configurefconfigure - 旧版本的Tcl)命令来更改此编码或通过指定通道处于“二进制模式”来完全禁止转换。这同样适用于file formats次转化。

另请注意,Tcl有专门的软件包可以有效地隐藏使用特定有线/文件格式的复杂性。举一个例子,EOL包与XML一起使用;当您使用此程序包操作XML时,您并不关心在保存到文件时必须如何表示XML - 您只需使用tdom的对象,本机Tcl字符串等。 / p>

答案 1 :(得分:0)

文档相当不错,包含示例:

也许你可以问一个更具体的问题?

答案 2 :(得分:0)

format命令汇编 字符 的字符串,binary format命令汇编 字节的字符串即可。 scanbinary scan命令反向执行,分别从字符串和字节字符串中提取形式。

请注意,Tcl恰好将字节字符串整齐地映射到字符在\u0000 - \u00FF范围内的字符串,还有其他操作可以将信息输入和输出二进制字符串有时相关。最值得注意的是,encoding converttoencoding convertfromencoding convertto将字符串格式化为一个字节序列,表示给定编码中的字符串 (可能丢失信息的操作) )和encoding converfrom的方向相反。


那么Tcl的字符串真正的编码是什么?嗯,没有真的。或者很多。逻辑层专门用于字符序列,实现实际上会来回移动(主要是在UTF-8和UCS-2的变体之间,尽管通过unsigned char数组处理字节串的优化)必要。虽然这并不总是非常有效,但大多数代码从未注意到由于使用了类型缓存而发生了什么。

如果你有Tcl 8.6,你可以在封面后面 peek 来观察不支持命令的类型:

# Output is human-readable; experiment to see what it says for you
puts [tcl::unsupported::representation $MyString]

不要用它来做出功能决定; Tcl 非常很高兴从你的脚下改变类型。但是,在找出代码意外缓慢的原因时,它会有所帮助。 (另请注意,类型附加到值,而不附加到变量。)