formatString 由零个或多个字段说明符(specifier)的序列组成,用零个或多个空格分隔。每个说明符都是一个单独的类型字符,跟随着一个可选的数值 count。多数字段说明符消耗(consume)一个参数来获取被格式化的值。类型字符指定如何格式化值。count 典型的指示从值中接受了多少个指定类型的单项(item)。如果count 存在,则是一个非负十进制整数或 *,星号通常指示使用在值中所有的单项。如果参数的个数不匹配在消耗参数的这些格式串中的字段的个数,则产生一个错误。
每个类型-数目(type-count)对在二进制串上移动一个假想的游标,在当前的位置上存储一些字节并且游标前进到最近存储的字节的紧后面。游标初始在位置 0 也就是在数据的开始(端)。类型可以是下列字符中的任意一个:
binary format a7a*a alpha bravo charlie将返回等价于 alpha\000\000bravoc 的一个串。
binary format A6A*A alpha bravo charlie将返回 alpha bravoc。
binary format b5b* 11100 111000011010将返回等价于 \x07\x87\x05 的一个串。
binary format B5B* 11100 111000011010将返回等价于 \xe0\xe1\xa0 的一个串。
binary format h3h* AB def将返回等价于 \xba\x00\xed\x0f 的一个串。
binary format H3H* ab DEF将返回等价于 \xab\x00\xde\xf0 的一个串。
binary format c3cc* {3 -3 128 1} 260 {2 5}将返回等价于 \x03\xfd\x80\x04\x02\x05 的一个串。而
binary format c {2 5}将产生一个错误。
binary format s3 {3 -3 258 1}将返回等价于 \x03\x00\xfd\xff\x02\x01 的一个字符串。
binary format S3 {3 -3 258 1}将返回等价于 \x00\x03\xff\xfd\x01\x02 的一个串。
- 除了以小端(little-endian)字节序在输出串中存储一个或多个32位整数之外,这种形式同于 c。在当前位置上把每个整数的低位的32位存储成一个四字节的值,并且首先存储最低有效字节。例如,
binary format i3 {3 -3 65536 1}将返回等价于 \x03\x00\x00\x00\xfd\xff\xff\xff\x00\x00\x01\x00 的一个串。
binary format I3 {3 -3 65536 1}将返回等价于 \x00\x00\x00\x03\xff\xff\xff\xfd\x00\x01\x00\x00 的一个串。
binary format f2 {1.6 3.4}将返回等价于 \xcd\xcc\xcc\x3f\x9a\x99\x59\x40 的一个串。
binary format d1 {1.6}将返回等价于 \x9a\x99\x99\x99\x99\x99\xf9\x3f 的一个串。
binary format a3xa3x2a3 abc def ghi将返回等价于 abc\000def\000\000ghi 的一个串。
binary format a3X*a3X2a3 abc def ghi将返回 dghi。
binary format a5@2a1@*a3@10a1 abcde f ghi j将返回 abfdeghi\000\000j。
如同 binary format 那样,formatString 由零个或多个字段说明符(specifier)的序列组成,用零个或多个空格分隔。每个说明符都是一个单独的类型字符,跟随着一个可选的数值 count。多数字段说明符消耗(consume)一个参数来获取检索出的值要放置在其中的那个变量。类型字符指定如何解释二进制串。count 典型的指定从数据中接受指定类型的多少个单项(item)。如果存在,count 是一个非负数的十进制整数或 *,星号通常指示要用到在数据中所有的剩余的单项。如果在满足当前字段说明符的当前位置之后没有剩下足够的字节,则相应的变量保持不动(untouch)而 binary scan 立即返回设置了的变量的个数。如果没有足够的参数给所有这些消耗参数的格式串中的字段,则产生一个错误。
着重注意 c、s、和 S(还有在64位系统上的 i 和 I)将被检索成一个长数据大小的值。在这种情况下,(最)高位设置(为1)的值(对于char 是 0x80,对于 short 是 0x8000,对于 int 是 0x80000000),将被符号扩展。所以下列情况将发生:
set signShort [binary format s1 0x8000] binary scan $signShort s1 val; # val == 0xFFFF8000如果你打算生成一个无符号值,那么你可以把返回值屏蔽(mask)成需要的大小。例如,要生成一个无符号 short 值:
set val [expr {$val & 0xFFFF}]; # val == 0x8000
每个类型-数目(type-count)对在二进制串上移动一个假想的游标,从当前的位置上读一些字节。游标的初始在位置 0 也就是数据的开始(端)。类型可以是下列字符中的任意一个:
binary scan abcde\000fghi a6a10 var1 var2将返回 1,并把等价于 abcde\000 的一个字符串存储到 var1 而 var2 保持不变。
binary scan "abc efghi \000" A* var1将返回 1 ,并把 abc efghi 存储到 var1。
binary scan \x07\x87\x05 b5b* var1 var2将返回 2,并把 11100 存储到 var1 且 1110000110100000 存储到 var2。
binary scan \x70\x87\x05 B5B* var1 var2将返回 2,并把 01110 存储到 var1 且 1000011100000101 存储到 var2。
binary scan \x07\x86\x05 h3h* var1 var2将返回 2,并把 706 存储到 var1 且 50 存储到 var2。
binary scan \x07\x86\x05 H3H* var1 var2将返回 2,并把 078 存储到 var1 且 05 存储到 var2。
binary scan \x07\x86\x05 c2c* var1 var2将返回 2,并把 7 -122 存储到 var1 且 5 存储到 var2。注意返回的整数是有符号的,但它们是类似下面这样的表达式来转换成无符号的8位数量(quantity):
expr ( $num + 0x100 ) % 0x100
binary scan \x05\x00\x07\x00\xf0\xff s2s* var1 var2将返回 2,并把 5 7 存储到 var1 且 -16 存储到 var2。 注意返回的整数是有符号的,但它们是类似下面这样的表达式来转换成无符号的16位数量(quantity):
expr ( $num + 0x10000 ) % 0x10000
binary scan \x00\x05\x00\x07\xff\xf0 S2S* var1 var2将返回 2 ,并把 5 7 存储到 var1 且 -16 存储到 var2。
binary scan \x05\x00\x00\x00\x07\x00\x00\x00\xf0\xff\xff\xff i2i* var1 var2将返回 2 ,并把 5 7 存储到 var1 且 -16 存储到 var2。注意返回的整数是有符号的并且不能被 Tcl 表示成无符号的值。
binary \x00\x00\x00\x05\x00\x00\x00\x07\xff\xff\xff\xf0 I2I* var1 var2将返回 2 ,并把 5 7 存储到 var1 且 -16 存储到 var2。
binary scan \x3f\xcc\xcc\xcd f var1将返回 1 ,并把 1.6000000238418579 存储到 var1。
binary scan \x9a\x99\x99\x99\x99\x99\xf9\x3f d var1将返回 1 ,并把 1.6000000000000001 存储到 var1。
- 在 string 中正向移动游标 count 字节。如果 count 是 * 或比当前游标位置之后的字节数大,则游标定位到位置 string 中的最后一个字节之后。如果省略了count,则游标正向移动一字节。 注意 这种形式不消耗参数。例如,
binary scan \x01\x02\x03\x04 x2H* var1将返回 1,并把 0304 存储到 var1。
binary scan \x01\x02\x03\x04 c2XH* var1 var2将返回 2 ,并把 1 2 存储到 var1 且 020304 存储到 var2。
在数据串中把游标移动到由 count 指定的绝对位置上。位置 0 参照在 string 中的第一个字节。如果 count 参照的位置超出 string 的末端,则把游标定位在最后的字节的后面。如果省略了 count,则产生一个错误。例如,
binary scan \x01\x02\x03\x04 c2@1H* var1 var2将返回 2 ,并把 1 2 存储到 var1 且 020304 存储到 var2。
Copyright © 1997 by Sun Microsystems, Inc. Copyright © 1995-1997 Roger E. Critchlow Jr.