Tcl 什么是二进制扫描;xyz";怎么办?
我看到以下代码:Tcl 什么是二进制扫描;xyz";怎么办?,tcl,Tcl,我看到以下代码: binary scan "xyz" H* var 这让我困惑:二进制扫描应该扫描二进制流并构造字符串类型变量,但这里是“xyz” 我在tclsh中做了以下实验: % puts $var 78797a <== what is this? % binary scan $var @1H y <== I mean to get "y" 1 % puts $y <== but I get "3"? 3 %put$var 78797a知道字
binary scan "xyz" H* var
这让我困惑:二进制扫描
应该扫描二进制流并构造字符串类型变量,但这里是“xyz”
我在tclsh中做了以下实验:
% puts $var
78797a <== what is this?
% binary scan $var @1H y <== I mean to get "y"
1
% puts $y <== but I get "3"?
3
%put$var
78797a知道字符“x”的十六进制值是0x78有帮助吗?或者二进制扫描\x78\x79\x7a H*var2
与您的示例相同?我认为,“H”转换代码下的“二进制扫描”手册页面中的示例对其进行了很好的解释。知道字符“x”的十六进制值是0x78有帮助吗?或者二进制扫描\x78\x79\x7a H*var2
与您的示例相同?我认为,“H”转换代码下的“二进制扫描”手册页面中的示例对其进行了很好的解释。在您的代码中:
binary scan "xyz" H* var
二进制字符串是xyz
,它是三个字节,分别是x
、y
和z
的ASCII值。然后,我们要求为var
变量提供一个以大端顺序扫描的字节的十六进制数字序列(顺便说一句,处理字符串非常正确!),十六进制数字是二进制字符串中字节数的两倍(因为*
)。让我们再次检查以下内容:
数据被转换成一个从高到低的计数十六进制数字字符串,表示为集合“0123456789abcdef”中的字符序列。数据字节按从上到下的顺序进行扫描,每个字节内的十六进制数字按从高到低的顺序进行。忽略最后一个字节中的任何额外位。如果count为*
,则将扫描字符串中所有剩余的十六进制数字。如果忽略计数,则将扫描一个十六进制数字。比如说,
binary scan \x07\xC6\x05\x1f\x34 H3H* var1 var2
将返回2
,其中07c
存储在var1中,而051f34
存储在var2中
现在,xyz
中有三个字节,因此78797a
中有六个数字。前两个十六进制数字,78
是ASCII版本的x
()的十六进制数字,同样适用于79
和7a
当你这样做时:
binary scan $var @1H y
将内部光标移动到字符串中,指向8
(因为基于零的索引),\x38
,并且因为H
没有计数,所以它获取38
(即3
)的第一个十六进制数字,并将其放入y
变量中
要实际检索y
,只需在原始二进制字符串上使用string index
或string range
(因为所有Tcl的string命令都可以在二进制数据上正常工作)。或者使用字符串范围
从var
中获取十六进制数字,并使用二进制格式
转换回:
binary format H* [string range $var 2 3]
对二进制扫描的结果进行二进制扫描
可能不是一个好主意。这样做是完全合法的,但结果不太可能说明问题。在您的代码中:
binary scan "xyz" H* var
二进制字符串是xyz
,它是三个字节,分别是x
、y
和z
的ASCII值。然后,我们要求为var
变量提供一个以大端顺序扫描的字节的十六进制数字序列(顺便说一句,处理字符串非常正确!),十六进制数字是二进制字符串中字节数的两倍(因为*
)。让我们再次检查以下内容:
数据被转换成一个从高到低的计数十六进制数字字符串,表示为集合“0123456789abcdef”中的字符序列。数据字节按从上到下的顺序进行扫描,每个字节内的十六进制数字按从高到低的顺序进行。忽略最后一个字节中的任何额外位。如果count为*
,则将扫描字符串中所有剩余的十六进制数字。如果忽略计数,则将扫描一个十六进制数字。比如说,
binary scan \x07\xC6\x05\x1f\x34 H3H* var1 var2
将返回2
,其中07c
存储在var1中,而051f34
存储在var2中
现在,xyz
中有三个字节,因此78797a
中有六个数字。前两个十六进制数字,78
是ASCII版本的x
()的十六进制数字,同样适用于79
和7a
当你这样做时:
binary scan $var @1H y
将内部光标移动到字符串中,指向8
(因为基于零的索引),\x38
,并且因为H
没有计数,所以它获取38
(即3
)的第一个十六进制数字,并将其放入y
变量中
要实际检索y
,只需在原始二进制字符串上使用string index
或string range
(因为所有Tcl的string命令都可以在二进制数据上正常工作)。或者使用字符串范围
从var
中获取十六进制数字,并使用二进制格式
转换回:
binary format H* [string range $var 2 3]
对二进制扫描的结果进行二进制扫描
可能不是一个好主意。这样做是完全合法的,但结果不太可能说明问题