TCL:format、binary format、scan和binary scan命令之间有什么区别?

TCL:format、binary format、scan和binary scan命令之间有什么区别?,tcl,Tcl,有人能给我解释一下scan和binary scan之间的区别吗 格式和二进制格式 我对二进制命令感到困惑。这些文档非常好,包含以下示例: 扫描: 格式: 二进制扫描: 二进制格式: 也许您可以问一个更具体的问题?要理解处理二进制和字符串数据的命令集之间的区别,您必须理解这两种数据之间的区别 在Tcl中,就像在许多(大多数?)高级语言中一样,字符串是相当抽象的——也就是说,它们是用相当高级的术语描述的。特别是在Tcl中,字符串被定义为具有以下属性: 它们包含剧目中的人物 Tcl运行时提供了一

有人能给我解释一下
scan
binary scan
之间的区别吗

格式
二进制格式


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

这些文档非常好,包含以下示例:

  • 扫描:
  • 格式:
  • 二进制扫描:
  • 二进制格式:

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

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

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

  • 它们包含剧目中的人物
  • Tcl运行时提供了一组标准命令来操作字符串,例如索引、搜索、附加到、提取子字符串等
请注意,此定义忽略了许多内容:

  • 存储这些Unicode字符的编码
  • 它们究竟是如何存储的(
    NUL
    终止的数组?未签名长数组的链表?其他什么?)
(从一个更有趣的角度来看,Tcl能够透明地改变它所管理的字符串的底层表示形式-在
UTF-8
UTF-16
编码序列之间。但这里我们讨论的是,其他实现(例如)完全可以自由地做其他事情。)

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

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

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


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

使用
format
命令组合字符的字符串,
二进制格式
命令将字节的字符串组合起来
scan
binary scan
命令执行相反的操作,分别从字符串和字节字符串中提取信息

请注意,Tcl恰好将字节字符串整齐地映射到字符串上,其中字符的范围为
\u0000
\u00FF
,还有其他一些操作用于从二进制字符串中获取信息,这些操作有时是相关的。最值得注意的是,
encoding convertto
encoding convertfrom
encoding convertto
将字符串格式化为一个字节序列,在给定的编码中表示该字符串(一种可能丢失信息的操作),而
编码转换从
转到相反的方向


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

如果您使用的是Tcl 8.6,则可以通过不受支持的命令查看封套后面的类型:

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

不要将此作为功能决策的基础;Tcl非常乐意从您的脚下变异类型。但是,它可以帮助您找出代码出人意料地慢的原因。(还请注意,类型附加到值,而不是变量。)

[binary scan]解析二进制字符串中的字段,返回执行的转换次数。“二进制扫描abcdefg s3s first second”命令说明是输入应为二进制字符串。。但是在这个例子中,我传递了字符。。我对这些术语感到困惑,所以。。根据您的解释,二进制扫描读取二进制数据。但在我的例子中,我通过了a