什么是二进制扫描" xyz" H *呢?

时间:2018-03-22 19:32:03

标签: tcl

我看到以下代码:

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

我迷路了。

你能解释一下发生了什么吗?

2 个答案:

答案 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,它是三个字节,是xyz的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版xcheck for yourself)的十六进制,797a类似。

然后你这样做:

binary scan $var @1H y 

将内部游标移动到字符串中,转移到8的ASCII字节(因为从零开始索引),\x38,并且因为count没有H {1}},它获取38第一个十六进制数字(即3)并将其放入y变量。

要实际检索y,您可以在原始二进制字符串上使用string indexstring range(因为所有Tcl的字符串命令对二进制数据都可以正常工作)。或者您使用string rangevarbinary format中获取十六进制数字以转换回来:

binary format H* [string range $var 2 3]

binary scan binary scan的结果可能不是一个好主意。这样做是完全合法的,但结果不太可能说明。