binary - 从(向)二进制串插入和提取字段 / BINARY FORMAT & BINARY SCAN

binary - 从(向)二进制串插入和提取字段

??? SYNOPSIS
       binary format formatString ?arg arg ...?
       binary scan string formatString ?varName varName ...?
_________________________________________________________________

??? DESCRIPTION
        这个命令提供操纵二进制数据的设施。第一种形式是 binary format,从普通的
       Tcl          值来建立一个二进制串。例如,给出值          16          和
       22,可以产生一个8字节的二进制串,由两个4字节的整数组成。第二种形式是
       binary  scan,做相反的事:  从一个二进制串中提取出数据并作为通常的   Tcl
       字符串值而返回。

????? BINARY FORMAT
       binary      format      命令生成一个二进制串,其格式由     formatString
       指定,它的内容来(自在后面)增添的参数。返回结果二进制值。

       formatString
       由零个或多个字段说明符(specifier)的序列组成,用零个或多个空格分隔。每个说明符都是一个单独的类型字符,跟随着一个可选的数值
       count。多数字段说明符消耗(consume)一个参数来获取被格式化的值。类型字符指定如何格式化值。count
       典型的指示从值中接受了多少个指定类型的单项(item)。如果count
       存在,则是一个非负十进制整数或
       *,星号通常指示使用在值中所有的单项。如果参数的个数不匹配在消耗参数的这些格式串中的字段的个数,则产生一个错误。

       每个类型-数目(type-
       count)对在二进制串上移动一个假想的游标,在当前的位置上存储一些字节并且游标前进到最近存储的字节的紧后面。游标初始在位置
       0 也就是在数据的开始(端)。类型可以是下列字符中的任意一个:

       a    在输出串中存储长度是  count  的一个字符串。如果   argcount
            的字节数少,则有增补的零字节来填充字段。如果                   arg
            比指定长度多,忽略额外的字符。如果  count*,  则格式化在  arg
            中的所有字节。如果省略了 count ,则格式化一个字符。例如,
                   binary format a7a*a alpha bravo charlie
            将返回等价于 alpha\000\000bravoc的一个串。

       A    除了使用空格而不是空字符来填充之外,这种形式同于 a。例如,
                   binary format A6A*A alpha bravo charlie
            将返回 alpha bravoc.

       b    在输出串中存储                                               count
            个二进制数字的一个串,并且在每个字节中以从低到高的次序(来排序)。Arg
            必须包含一个                 10
            字符的一个序列。以从最先到最后的次序散布(emit)结果字节,并且以在每个字节中以从低到高的次序格式化每位。如果
            argcount     的位数少,则剩余的位使用零。如果     arg
            比指定的位数多,忽略额外的位。如果  count*,  则格式化在  arg
            中所有的位。如果省略了
            count,则格式化一位。如果如果格式化的位数不结束在字节边界上,最后的字节的剩余的位将是零。例如,
                   binary format b5b* 11100 111000011010
            将返回等价于 \x07\x87\x05的一个串。

       B    除了在每个字节中以从高到低的次序(来排序)之外,这种形式同于
            b。例如,
                   binary format B5B* 11100 111000011010
            将返回等价于 \xe0\xe1\xa0的一个串。

       h    在输出串中存储                                               count
            个十六进制的数字的一个串,并且在每个字节中以从低到高的次序(来排序)。Arg
            必须包含在“0123456789abcdefABCDEF”(字符)集中的字符的一个序列。以从最先到最后的次序散布(emit)结果字节,并且在每个字节中以从低到高的次序格式化十六进制数字。如果
            argcount    的数字个数少,则剩余的数字使用零。如果   arg
            比指定的数字的个数多,忽略额外的数字。如果 count*,则格式化在
            arg                 中所有的数字。如果省略了                 count
            ,则格式化一个数字。如果格式化的数字的个数不结束在一个字节的边界上,最后的字节的剩余的位将是零。例如,
                   binary format h3h* AB def
            将返回等价于 \xba\x00\xed\x0f的一个串。

       H    除了在每个字节中以从高到低的次序(来排序)之外,这种形式同于       h
            。例如,
                   binary format H3H* ab DEF
            将返回等价于 \xab\x00\xde\xf0的一个串。

       c    在输出串中存储一个或多个8位整数值。如果未指定    count,则     arg
            必须包含一个整数值;否则                                       arg
            必须包含至少有一个整数元素的一个列表。在当前的位置上把每个整数的低位(low-
            order)的      8      位存储成一个一字节的值。如果     count*,则格式化在列表中所有的整数。如果在列表中的元素的个数比    count
            少,则产生一个错误。        如果在列表中的元素的个数比       count
            多,则忽略额外的元素。例如,
                   binary format c3cc* {3 -3 128 1} 260 {2 5}
            将返回等价于 \x03\xfd\x80\x04\x02\x05 的一个串。而
                   binary format c {2 5}
            将产生一个错误。

       s    除了以小端(little-
            endian)字节序在输出串中存储一个或多个16位整数之外,这种形式同于
            c。在当前位置上把每个整数的低位的16位存储成一个两字节的值,并且首先存储最低有效(significant)字节。例如,
                   binary format s3 {3 -3 258 1}
            将返回等价于 \x03\x00\xfd\xff\x02\x01 的一个字串。

       S    除了以大端(big-
            endian)字节序在输出串中存储一个或多个16位整数之外,这种形式同于  s
            。例如,
                   binary format S3 {3 -3 258 1}
            将返回等价于 \x00\x03\xff\xfd\x01\x02 的一个串。

       i                                                    除了以小端(little-
            endian)字节序在输出串中存储一个或多个32位整数之外,这种形式同于
            c。在当前位置上把每个整数的低位的32位存储成一个四字节的值,并且首先存储最低有效字节。例如,
                   binary format i3 {3 -3 65536 1}
            将返回等价于      \x03\x00\x00\x00\xfd\xff\xff\xff\x00\x00\x01\x00
            的一个串。

       I    除了以大端(big-
            endian)字节序在输出串中存储一个或多个32位整数之外,这种形式同于
            i。例如,
                   binary format I3 {3 -3 65536 1}
            将返回等价于      \x00\x00\x00\x03\xff\xff\xff\xfd\x00\x01\x00\x00
            的一个串。

       f    除了以机器的本地表示在输出串中存储一个或多个单精度浮点数之外,这种形式同于
            c。这种表示是不能跨体系移植的,所以不应用于在网络上交流浮点数。浮点数的大小在体系间可能不同,所以生成的字节数也可能不同。如果值溢出了机器的本地表示,则使用系统定义的
            FLT_MAX                       的值。因为                       Tcl
            在内部使用双精度浮点数,在转换成单精度时可能损失些精度。例如,运行在
            Intel Pentium 处理器的一个 Windows 系统上,
                   binary format f2 {1.6 3.4}
            将返回等价于 \xcd\xcc\xcc\x3f\x9a\x99\x59\x40 的一个串。

       d    除了以机器的本地表示在输出串中存储一个或多个双精度浮点数之外,这种形式同于
            f。例如,运行在 Intel Pentium 处理器的一个 Windows 系统上,
                   binary format d1 {1.6}
            将返回等价于 \x9a\x99\x99\x99\x99\x99\xf9\x3f 的一个串。

       x    Stores  count  null  bytes  in the output string.  If count is not
            specified, stores one null byte.  If  count  is  *,  generates  an
            error.  This type does not consume an argument.  For example,
                   binary format a3xa3x2a3 abc def ghi
            将返回等价于 abc\000def\000\000ghi 的一个串。

       X    在输出串中反向移动游标     count    字节。如果    count*
            或比当前游标位置大,则游标定位到位置
            0,这样下个存储的字节将是结果串中的第一个字节。如果省略了count,则游标反向移动一字节。
            这种形式不使用参数。例如,
                   binary format a3X*a3X2a3 abc def ghi
            将返回 dghi.

       @    在输出串中把游标移动到由    count     指定的绝对位置上。位置     0
            参照在输出串中的第一个字节。如果                             count
            参照的位置超出至今所存储的最后的字节,则在空挡的(unitialized
            ?)位置上放置空字节并把游标放置到指定位置。如果       count*,则游标将被移动到输出串的末端。如果省略了
            count,则产生一个错误。这种类型不使用参数。例如,
                   binary format a5@2a1@*a3@10a1 abcde f ghi j
            将返回 abfdeghi\000\000j.

??????? BINARY SCAN
       binary   scan  命令从一个二进制串分析字段、返回完成的转换的数目。String
       给出要被分析的输入而    formatString    指示如何分析它。每个    varName
       给出一个变量的名字;当从                                         string
       检索出一个字段时,结果被赋给相应的变量。

       如同            binary            format             那样,formatString
       由零个或多个字段说明符(specifier)的序列组成,用零个或多个空格分隔。每个说明符都是一个单独的类型字符,跟随着一个可选的数值
       count。多数字段说明符消耗(consume)一个参数来获取检索出的值要放置在其中的那个变量。类型字符指定如何解释二进制串。count
       典型的指定从数据中接受指定类型的多少个单项(item)。如果存在,count
       是一个非负数的十进制整数或
       *,星号通常指示要用到在数据中所有的剩余的单项。如果在满足当前字段说明符的当前位置之后没有剩下足够的字节,则相应的变量保持不动(untouch)而
       binary                                                             scan
       立即返回设置了的变量的个数。如果没有足够的参数给所有这些消耗参数的格式串中的字段,则产生一个错误。

       着重   (important)   注意   c,   sS(还有在64位系统上的   iII)将被检索成一个长整型                                          (long)
       大小的值。在这种情况下,(最)高位设置(为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 也就是数据的开始(端)。类型可以是下列字符中的任意一个:

       a    数据是长度是  count  的一个字符串。如果  count*,则在 string
            中所有的剩余的字节将被检索到变量中。如果省略了
            count,则将检索一个字符。例如,
                   binary scan abcde\000fghi a6a10 var1 var2
            将返回  1  并把等价于  abcde\000  的一个字符串存储到  var1var2
            保持不变。

       A    除了在存储到变量之前从检索到的值中去除(strip)尾随的空白(blank)和空字符(null)之外,这种形式同于
            a。例如
                   binary scan "abc efghi  \000" A* var1
            将返回 1 并把 abc efghi 存储到 var1b    把数据转换成                                                 count
            位二进制数字的一个字符串,以从低到高的次序表示成“1”和“0”字符的一个序列。数据字节按从最先到最后的次序被检索,并且在每个字节中按从低到高的次序接受(每)位。忽略在最后的字节中的任何额外的位。如果
            count*,则检索在串中的所有的剩余的位。     如果省略了
            count,则检索一位。例如,
                   binary scan \x07\x87\x05 b5b* var1 var2
            将返回 2 并把 11100 存储到 var11110000110100000 存储到 var2.

       B    除了在每字节中按从高到低的次序接受(每)位之外,这种形式同于
            b。例如,
                   binary scan \x70\x87\x05 B5B* var1 var2
            将返回 2 并把 01110 存储到 var11000011100000101 存储到 var2.

       h    把数据转换成                                                 count
            个十六进制数字的一个字符串,以从低到高的次序表示成一个在
            “0123456789abcdefABCDEF”
            (字符)集中的字符的一个序列。按从最先到最后的次序检索数据字节,并且在每个字节中以从低到高的次序接受十六进制数字。忽略最后的字节中的任何额外的位。如果
            count*,   则检索在串中所有剩余的十六进制数字。如果省略了
            count,则检索一位十六进制数字。例如,
                   binary scan \x07\x86\x05 h3h* var1 var2
            将返回 2 并把 706 存储到 var150 存储到n var2.

       H    除了在每个字节中以从高到低的次序接受数字之外,这种形式同于
            h。例如,
                   binary scan \x07\x86\x05 H3H* var1 var2
            将返回 2 并把 078 存储到var105 存储到 var2.

       c    把数据转换成                                                 count
            个8位有符号整数并作为一个列表存储到相应的变量中。如果   count*,则检索在串中所有剩余的字节。如果省略了
            count,则检索一个8位整数。例如,
                   binary scan \x07\x86\x05 c2c* var1 var2
            将返回2  并把   7   -122   存储到   var15   存储到   var2.
            注意返回的整数是有符号的,但它们是类似下面这样的表达式来转换成无符号的8位数量(quantity):
                   expr ( $num + 0x100 ) % 0x100

       s    把数据解释成      count       个表示为小端字节序的16位有符号整数。
            整数被作为一个列表存储到相应的变量中。如果         count*,则检索在串中所有剩余的字节。如果省略了
            count,则检索一个16位整数。例如,
                   binary scan \x05\x00\x07\x00\xf0\xff s2s* var1 var2
            将返回   2   并把   5   7   存储到   var1-16  存储到  var2.
            注意返回的整数是有符号的,但它们是类似下面这样的表达式来转换成无符号的16位数量(quantity):
                   expr ( $num + 0x10000 ) % 0x10000

       S    除了把数据解释成                                             count
            个表示为大端字节序的16位有符号整数之外,这种形式同于 s。例如,
                   binary scan \x00\x05\x00\x07\xff\xf0 S2S* var1 var2
            将返回 2 并把 5 7 存储到 var1-16 存储到 var2.

       i    把数据解释成      count       个表示为小端字节序的32位有符号整数。
            整数被作为一个列表存储到相应的变量中。如果         count*,则检索在串中所有剩余的字节。如果省略了
            count,则检索一个32位整数。例如,
                   binary scan \x05\x00\x00\x00\x07\x00\x00\x00\xf0\xff\xff\xff i2i* var1 var2
            将返回    2    ,并把    5   7   存储到   var1-16   存储到
            var2。注意返回的整数是有符号的并且不能被 Tcl 表示成无符号的值。

       I    除了把数据解释成                                             count
            个表示为大端字节序的32位有符号整数之外,这种形式同于 i。例如,
                   binary \x00\x00\x00\x05\x00\x00\x00\x07\xff\xff\xff\xf0 I2I* var1 var2
            将返回 2  ,并把 5 7 存储到 var1-16 存储到 var2f    把数据解释成                                                 count
            个机器本地表示的单精度浮点数,把浮点数作为一个列表存储到相应的变量中
            。如果    count*,则检索在串中所有剩余的字节。如果省略了
            count,则检索一个单精度浮点数。
            浮点数的大小在体系间可能不同,所以检索的字节数也可能不同。如果数据不表示一个有效的浮点数,结果值是未定义的并且依赖于编译器。例如,运行在
            Intel Pentium 处理器的一个 Windows 系统上,
                   binary scan \x3f\xcc\xcc\xcd f var1
            将返回 1,并把 1.6000000238418579 存储到 var1d    除了把数据解释成                                             count
            个机器本地表示的双精度浮点数之外,这种形式同   于  f。例如,运行在
            Intel Pentium 处理器的一个 Windows 系统上,
                   binary scan \x9a\x99\x99\x99\x99\x99\xf9\x3f d var1
            将返回 1 ,并把 1.6000000000000001 存储到 var11。

       xstring   中正向移动游标   count   字节。如果   count*
            或比当前游标位置之后的字节数大,则游标定位到位置            string
            中的最后一个字节之后。如果省略了count,则游标正向移动一字节。 注意
            这种形式不消耗参数。例如,
                   binary scan \x01\x02\x03\x04 x2H* var1
            将返回 1,并把 0304 存储到 var1Xstring   中反向移动游标   count   字节。如果   count*
            或比当前游标位置大,则游标定位到位置     0,这样下个检索的字节将是
            string     中的第一个字节。如果省略了count,则游标反向移动一字节。
            注意这种形式不消耗参数。例如,
                   binary scan \x01\x02\x03\x04 c2XH* var1 var2
            将返回 2,并把 1 2 存储到 var1020304 存储到 var2@    在数据串中把游标移动到由 countt  指定的绝对位置上。位置  0  参照在
            string    中的第一个字节。如果    count    参照的位置超出   string
            的末端,则把游标定位在最后的字节的后面。如果省略了
            count,则产生一个错误。例如,  
                   binary scan \x01\x02\x03\x04 c2@1H* var1 var2
            将返回 2 ,并把 1 2 存储到 var1 且 020304 存储到 var2。

??????????? PLATFORM ISSUES
        有时希望以机器的本地字节序来格式化或检索整数值。参照      tcl_platform
       数组中的 byteOrder 元素来决定在格式化或检索整数时使用那种类型字符。

TCL(Tool Command Language) 本书籍由浅入深系统地介绍了Tcl语言,是学习Tcl语言的良师益友 Tcl编程初步 总目录 总目录 I 例索引. IV 表索引.VI 图索引VII 第 1 章. TCL基本知识 1 1.1 什么是 TCL ..1 1.2 TCL自学工具..1 1.3 TCL软件包 ..2 1.4 TCL命令格式..2 1.5 TCL脚本文件 SOURCE 命令..3 1.6 可执行脚本文件(EXECUTABLE FILE) .3 1.7 获得帮助..4 1.7.1 Windows系统.4 1.7.2 Unix系统4 第 2 章. 输出、赋值与替换.. 5 2.1 PUTS .5 2.2 SET & UNSET ..5 2.3 替换6 2.3.1 $.6 2.3.2 [] 6 2.3.3 " " {} .6 2.3.4 \.7 第 3 章. 数学表达式与 EXPR命令. 8 3.1 数学逻辑运算符..8 3.2 数学函数..8 3.3 数学运算举例9 3.4 INCR命令 .9 第 4 章. 字符串.. 10 4.1 基本命令集..10 4.2 APPEND命令.10 4.3 FORMAT命令.10 4.3.1 format 命令说明 10 4.3.2 format 举例.. 11 4.4 SCAN命令.12 4.5 BINARY命令..13 4.6 SUBST命令..14 4.7 STRING 命令 ..15 4.7.1 string 命令列表 15 4.7.2 字符串比较 16 4.7.3 string match字符串匹配.. 16 4.7.4 字符串替换 18 4.7.5 字符类别(class)测试. 18 4.7.6 字符串映射 19 第 5 章. TCL列表操作.. 20 5.1 列表命令集..20 5.2 LIST命令..20 5.3 CONCAT命令21 5.4 LAPPEND命令 ..21 5.5 LLENGTH 命令22 5.6 LINDEX命令22 5.7 LRANGE命令.22 5.8 LINSERT LREPLACE命令..22 5.9 LSEARCH命令23 5.10 LSORT命令.24 5.11 JOIN与 SPLIT命令24 5.12 FOREACH控制结构27 第 6 章. 数组 28 6.1 数组的定义与格式28 6.2 数组变量29 6.3 多维数组29 6.4 数组操作命令.30 6.4.1 array get 命令 30 6.4.2 array names命令. 30 6.4.3 遍历数组 31 6.4.4 用数组定义结构.. 31 第 7 章. 控制结构命令. 32 7.1 IF/ELSE命令32 7.2 FOR命令.33 7.3 WHILE命令.33 7.4 BREAK 与 CONTINUE命令..34 7.5 SWITCH命令..34 7.6 CATCH 命令..35 7.7 ERROR命令36 7.8 RETURN 命令..37 7.9 EXIT命令.37 第 8 章. 过程与作用域. 38 8.1 PROC—过程定义命令..38 8.2 作用域.40 8.2.1 过程的作用域 40 8.2.2 变量的作用域 40 8.3 UPVAR命令42 8.4 RENAME命令 44 8.5 特殊变量45 8.5.1 命令行参数 45 8.5.2 env--环境变量数组 45 8.6 EVAL命令..46 8.7 UPLEVEL命令.48 第 9 章. 正则表达式(REGULAR EXPRESSIONS).. 49 9.1 REGEXP命令 .49 9.2 REGSUB命令..51 9.3 正则表达式的语法52 9.3.1 分支(branch)原子(atom) 52 9.3.2 基本语法 52 9.3.2.1 匹配字符52 9.3.2.2 限定匹配53 9.3.2.3 方括号表达式与字符集.53 9.3.2.4 匹配分支54 9.3.2.5 量词(Qulifier)..54 9.3.2.6 子模式与匹配报告捕获.55 9.3.2.7 反斜杠引用..56 9.3.2.8 匹配优先级..56 9.3.3 高级正则表达式(AREs).. 57 9.3.3.1 反斜杠换码(escape)序列57 9.3.3.2 归整元素(collating element) ..57 9.3.3.3 等价类(equivalence class) ..58 9.3.3.4 字符类(character class).58 9.3.3.5 非贪婪量词..59 9.3.3.6 约束量词59 9.3.3.7 回退引用59 9.3.3.8 前瞻(lookahead)60 9.3.3.9 换行符敏感的匹配60 9.3.3.10 嵌入式选项60 9.3.3.11 扩展语法.60 9.3.4 语法小结 60 9.3.5 其它支持正则表达式的命令.. 60 第 10 章. 名字空间. 62 10.1 创建名字空间62 10.2 用::限定符来使用变量过程.62 10.3 名字空间的变量 63 10.4 过程的进口与出口64 10.5 内省(INTROSPECTION) 65 10.6 名字空间命令集 65 第 11 章. 跟踪与调试. 67 11.1 CLOCK命令..67 11.1.1 clock clicks命令 67 11.1.2 clock seconds命令 67 11.1.3 clock format 命令 68 11.1.4 clock scan命令. 70 11.2 INFO 命令71 11.2.1 info level .. 72 11.2.2 info exists . 72 11.3 TRACE命令73 11.3.1 trace variable 73 11.3.2 trace vdelete. 75 11.3.3 trace vinfo 75 第 12 章. 脚本库与软件包 76 12.1 声明使用软件包76 12.1.1 软件包定位 76 12.1.2 声明软件包命令.. 76 12.1.3 加载软件包命令.. 76 12.1.4 自动加载与软件包索引 77 12.1.5 用链接库提供软件包. 79 12.2 PACKAGE命令集80 12.3 小结80 第 13 章. 文件操作与程序调用.. 81 13.1 文件操作..81 13.1.1 文件 I/O. 81 13.1.2 文件系统信息命令.. 82 13.1.2.1 glob命令..83 13.1.2.2 file命令集..83 13.2 程序调用..85 13.2.1 用 open命令打开一个进程管道. 85 13.2.2 用 exec命令调用程序. 87 13.2.3 pid命令. 88 第 14 章. 套接字与事件驱动编程简介 89 14.1 套接字编程.89 14.1.1 socket 命令.. 89 14.1.1.1 Client端socket命令..89 14.1.1.2 Server端socket命令选项90 14.1.2 用 fconfigure配置套接字. 90 14.1.3 C/S编程举例 90 14.2 事件驱动编程93 14.2.1 after命令. 93 14.2.2 fileevent 命令. 96 14.2.3 vwait 命令 96 14.2.4 fconfigure命令 . 97 14.2.4.1 fconfigure语法.97 14.2.4.2 非阻塞I/O.98 14.2.4.3 缓冲 ..98 参考文献. 100 例索引 例 1-1 输出一段字符串的例子.. 2 例 1-2 source命令的简单例子 3 例 2-1 输出一个词的例子 5 例 2-2 参数定义、赋值与参数值引用 5 例 2-3 嵌套$用做替换操作. 6 例 2-4 命令替换[]的例子 6 例 2-5 {}替换的例子.. 6 例 2-6 \的例子.7 例 2-7 不规范的续行 7 例 3-1 数学运算举例. 9 例 4-1 append命令的简单例子. 10 例 4-2 位置说明符的例子. 11 例 4-3 format命令的简单例子. 11 例 4-4 scan命令的简单例子. 12 例 4-5 体验 binary format binary scan的作用 13 例 4-6 binary命令的简单应用.. 14 例 4-7 subst命令的简单例子. 14 例 4-8 string compare string equal进行字符串比较的例子. 16
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值