我看到以下代码:
binary scan "xyz" H* var
让我感到困惑:binary scan
应该扫描二进制流并构造字符串类型变量,但这里是" 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
我迷路了。
你能解释一下发生了什么吗?
答案 0 :(得分:2)
知道字符&#39; x&#39;的十六进制值是否有帮助?是0x78?或者binary scan \x78\x79\x7a H* var2
与您的示例相同?二进制扫描中的示例&#39; &#39; H&#39;下的手册页转换代码很好地解释了,我想。
答案 1 :(得分:2)
在您的代码中:
binary scan "xyz" H* var
二进制字符串是xyz
,它是三个字节,是x
,y
和z
的ASCII值。然后,我们要求var
变量以大端顺序给出扫描字节的序列十六进制数字(非常适合处理字符串,BTW!),其中十六进制数字的数量是字节数的两倍在二进制字符串中(因为*
)。让我们仔细检查一下documentation says:
数据被转换为 count 十六进制数字的字符串,从高到低的顺序表示为集合“0123456789abcdef”中的字符序列。数据字节按从头到尾的顺序扫描,十六进制数字在每个字节内以从高到低的顺序进行。最后一个字节中的任何额外位都将被忽略。如果 count 为
*
,则将扫描 string 中的所有剩余十六进制数字。如果省略 count ,则将扫描一个十六进制数字。例如,binary scan \x07\xC6\x05\x1f\x34 H3H* var1 var2
将返回
2
,其中07c
存储在 var1 中,051f34
存储在 var2 中。
现在,xyz
中有三个字节,因此78797a
中有六位数字。前两个十六进制数字78
是ASCII版x
(check for yourself)的十六进制,79
和7a
类似。
然后你这样做:
binary scan $var @1H y
将内部游标移动到字符串中,转移到8
的ASCII字节(因为从零开始索引),\x38
,并且因为count
没有H
{1}},它获取38
的第一个十六进制数字(即3
)并将其放入y
变量。
要实际检索y
,您可以在原始二进制字符串上使用string index
或string range
(因为所有Tcl的字符串命令对二进制数据都可以正常工作)。或者您使用string range
从var
和binary format
中获取十六进制数字以转换回来:
binary format H* [string range $var 2 3]
binary scan
binary scan
的结果可能不是一个好主意。这样做是完全合法的,但结果不太可能说明。