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]

二进制扫描的结果进行
二进制扫描
可能不是一个好主意。这样做是完全合法的,但结果不太可能说明问题