Provided by: manpages-zh_1.5.1-1_all bug

NAME

       binary - 從(向)二進制串插入和提取字段

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

yz DESCRIPTION
        這茤R令提供操縱二進制數據的設施。第一種形式是  binary format,從普通的
       Tcl    茷堨艉@茪G進制串。例如,給出    16     和     22,可以產生一-
       8字節的二進制串,由兩4字節的整數組成。第二種形式是             binary
       scan,做相反的事:  從一茪G進制串中提取出數據並作為通常的  Tcl   字符串-
       茠藀^。

Gi BINARY FORMAT
       binary      format      命令生成一茪G進制串,其格式由      formatString
       指定,它的內容來(自在後)增添的參數。返回結果二進制C

       formatString      由零茤峖h茼r段說明符(specifier)的序列組成,用零茤峖h-
       茠躓璊戴j。每蚖〝符都是一茬瞈W的類型字符,跟隨著一茈i選的數
       count。多數字段說明符消耗(consume)一荌捊蚗簳被格式化的-
       C類型字符指定如何格式化Ccount            典型的指示從仃筐了多少-
       茷定類型的單項(item)。如果count           存在,則是一茷Dt十進制整數或
       *,星號通常指示使用在予狾釭熙瘨窗C如果參數的-
       蚍ㄓt在消耗參數的這些格式串中的字段的蚍A則產生一蚇欞~。

       每蚚型-數目(type-count)對在二進制串上移動一-
       荌眺Q的遊標,在當前的位置上存儲一些字節並且遊標前進到最近存儲的字節的緊後-
       情C遊標初始在位置                                                     0
       也就是在數據的開始(端)。類型可以是下列字符中的任意一:

       a    在輸出串中存儲長度是   count   的一茼r符串。如果   argcount
            的字節數少,則有增補的零字節來填充字段。如果                   arg
            比指定長度多,忽略額外的字符。如果  count*,  則格式化在  arg
            中的所有字節。如果省略了 count ,則格式化一茼r符。例如,
                   binary format a7a*a alpha bravo charlie
            將返回等價於 alpha\000\000bravoc的一茼瞗C

       A    除了使用空格而不是空字符來填充之外,這種形式同於 a。例如,
                   binary format A6A*A alpha bravo charlie
            將返回 alpha bravoc.

       b    在輸出串中存儲         count         茪G進制數字的一茼瞗A並且在每-
            茼r節中以從低到高的次序(來排序)。Arg  必須包含一 10 字符的一-
            荍C。以從最先到最後的次序散佈(emit)結果字節,並且以在每-
            茼r節中以從低到高的次序格式化每位。如果      argcount
            的位數少,則剩餘的位使用零。如果                               arg
            比指定的位數多,忽略額外的位。如果  count*,  則格式化在  arg
            中所有的位。如果省略了
            count,則格式化一位。如果如果格式化的位數不結束在字節邊界上,最後的字節的剩餘的位將是零。例如,
                   binary format b5b* 11100 111000011010
            將返回等價於 \x07\x87\x05的一茼瞗C

       B    除了在每茼r節中以從高到低的次序(來排序)之外,這種形式同於
            b。例如,
                   binary format B5B* 11100 111000011010
            將返回等價於 \xe0\xe1\xa0的一茼瞗C

       h    在輸出串中存儲       count       茪Q六進制的數字的一茼瞗A並且在每-
            茼r節中以從低到高的次序(來排序)。Arg
            必須包含在「0123456789abcdefABCDEF」(字符)集中的字符的一-
            荍C。以從最先到最後的次序散佈(emit)結果字節,並且在每-
            茼r節中以從低到高的次序格式化十六進制數字。如果   argcount
            的數字蚍痋A則剩餘的數字使用零。如果     arg      比指定的數字的-
            蚍h,忽略額外的數字。如果    count*,則格式化在    arg
            中所有的數字。如果省略了            count            ,則格式化一-
            蚍r。如果格式化的數字的蚍ㄤ異籉b一-
            茼r節的邊界上,最後的字節的剩餘的位將是零。例如,
                   binary format h3h* AB def
            將返回等價於 \xba\x00\xed\x0f的一茼瞗C

       H    除了在每茼r節中以從高到低的次序(來排序)之外,這種形式同於        h
            。例如,
                   binary format H3H* ab DEF
            將返回等價於 \xab\x00\xde\xf0的一茼瞗C

       c    在輸出串中存儲一茤峖h8位整數C如果未指定      count,則      arg
            必須包含一蚞蒱;否則     arg      必須包含至少有一蚞蒱葛尷漱@-
            茼C表。在當前的位置上把每蚞蒱漣C位(low-order)的   8  位存儲成一-
            茪@字節的C如果                     count*,則格式化在列表中所有的整數。如果在列表中的元素的蚍     count
            少,則產生一蚇欞~。        如果在列表中的元素的蚍         count
            多,則忽略額外的元素。例如,
                   binary format c3cc* {3 -3 128 1} 260 {2 5}
            將返回等價於 \x03\xfd\x80\x04\x02\x05 的一茼瞗C而
                   binary format c {2 5}
            將產生一蚇欞~。

       s    除了以小端(little-endian)字節序在輸出串中存儲一茤峖h-
            16位整數之外,這種形式同於                   c。在當前位置上把每-
            蚞蒱漣C位的16位存儲成一茖潀r節的A並且-
            漸存儲最低有效(significant)字節。例如,
                   binary format s3 {3 -3 258 1}
            將返回等價於 \x03\x00\xfd\xff\x02\x01 的一茼r串。

       S    除了以大端(big-endian)字節序在輸出串中存儲一茤峖h-
            16位整數之外,這種形式同於 s 。例如,
                   binary format S3 {3 -3 258 1}
            將返回等價於 \x00\x03\xff\xfd\x01\x02 的一茼瞗C

       i                 除了以小端(little-endian)字節序在輸出串中存儲一茤峖h-
            32位整數之外,這種形式同於                   c。在當前位置上把每-
            蚞蒱漣C位的32位存儲成一茈|字節的A並且-
            漸存儲最低有效字節。例如,
                   binary format i3 {3 -3 65536 1}
            將返回等價於      \x03\x00\x00\x00\xfd\xff\xff\xff\x00\x00\x01\x00
            的一茼瞗C

       I    除了以大端(big-endian)字節序在輸出串中存儲一茤峖h-
            32位整數之外,這種形式同於 i。例如,
                   binary format I3 {3 -3 65536 1}
            將返回等價於      \x00\x00\x00\x03\xff\xff\xff\xfd\x00\x01\x00\x00
            的一茼瞗C

       f    除了以機器的本地表示在輸出串中存儲一茤峖h-
            茬皞諞蚽B點數之外,這種形式同於
            c。這種表示是不能跨體系移植的,所以不應用於在網路上交流浮點數。浮點數的大小在體系間可能不同,所以生成的字節數也可能不同。如果-
            艇X了機器的本地表示,則使用系統定義的  FLT_MAX   的C因為   Tcl
            在內部使用雙精度浮點數,在轉換成單精度時可能損失些精度。例如,運行在
            Intel Pentium 處理器的一 Windows 系統上,
                   binary format f2 {1.6 3.4}
            將返回等價於 \xcd\xcc\xcc\x3f\x9a\x99\x59\x40 的一茼瞗C

       d    除了以機器的本地表示在輸出串中存儲一茤峖h-
            蚋戇諞蚽B點數之外,這種形式同於   f。例如,運行在   Intel  Pentium
            處理器的一 Windows 系統上,
                   binary format d1 {1.6}
            將返回等價於 \x9a\x99\x99\x99\x99\x99\xf9\x3f 的一茼瞗C

       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 的一茼瞗C

       X    在輸出串中反向移動遊標    count    字節。如果    count*
            或比當前遊標位置大,則遊標定位到位置                    0,這樣下-
            茼s儲的字節將是結果串中的第一-
            茼r節。如果省略了count,則遊標反向移動一字節。
            這種形式不使用參數。例如,
                   binary format a3X*a3X2a3 abc def ghi
            將返回 dghi.

       @    在輸出串中把遊標移動到由    count     指定的絕對位置上。位置     0
            參照在輸出串中的第一茼r節。如果                              count
            參照的位置超出至今所存儲的最後的字節,則在空擋的(unitialized
            ?)位置上放置空字節並把遊標放置到指定位置。如果       count*,則遊標將被移動到輸出串的末端。如果省略了       count,則產生一-
            蚇欞~。這種類型不使用參數。例如,
                   binary format a5@2a1@*a3@10a1 abcde f ghi j
            將返回 abfdeghi\000\000j.

Gi BINARY SCAN
       binary   scan   命令從一茪G進制串分析字段、返回完成的轉換的數目。String
       給出n被分析的輸入而 formatString  指示如何分析它。每  varName  給出一-
       蚥僆q的名字;當從 string 檢索出一茼r段時,結果被賦給相應的變量。

       如同       binary       format       那樣,formatString      由零茤峖h-
       茼r段說明符(specifier)的序列組成,用零茤峖h茠躓璊戴j。每蚖〝符都是一-
       茬瞈W的類型字符,跟隨著一茈i選的數
       count。多數字段說明符消耗(consume)一荌捊蚗簳檢索出的-
       n放置在其中的那蚥僆q。類型字符指定如何解釋二進制串。count
       典型的指定從數據中接受指定類型的多少茬瘨(item)。如果存在,count  是一-
       茷Dt數的十進制整數或                                   *,星號通常指示-
       n用到在數據中所有的剩餘的單項。如果在滿足當前字段說明符的當前位置之後沒有剩下足夠的字節,則相應的變量保持不動(untouch)而
       binary                   scan                   立即返回設置了的變量的-
       蚍C如果沒有足夠的參數給所有這些消耗參數的格式串中的字段,則產生一-
       蚇欞~。

       著 (important) 注意 c, sS(還有在64位系統上的 iII)將被檢索成一-
       茠蠷舕 (long) 大小的C在這種情況下,(最)高位設置(為1)的(對於char  是
       0x80,對於        short        是       0x8000,對於       int       是
       0x80000000),將被符號擴展。所以下列情況將發生:
              set signShort [binary format s1 0x8000]
              binary scan $signShort s1 val; # val == 0xFFFF8000
       如果你打算生成一茧L符號A那麼你可以把返回抻(mask)成需-
       n的大小。例如,n生成一茧L符號  short :
              set val [expr {$val & 0xFFFF}]; # val == 0x8000

       每蚚型-數目(type-count)對在二進制串上移動一-
       荌眺Q的遊標,從當前的位置上讀一些字節。遊標的初始在位置               0
       也就是數據的開始(端)。類型可以是下列字符中的任意一:

       a    數據是長度是  count  的一茼r符串。如果  count*,則在  string
            中所有的剩餘的字節將被檢索到變量中。如果省略了  count,則將檢索一-
            茼r符。例如,
                   binary scan abcde\000fghi a6a10 var1 var2
            將返回  1  並把等價於  abcde\000  的一茼r符串存儲到  var1var2
            保持不變。

       A    除了在存儲到變量之前從檢索到的-
            丰h除(strip)尾隨的空白(blank)和空字符(null)之外,這種形式同於
            a。例如
                   binary scan "abc efghi  \000" A* var1
            將返回 1 並把 abc efghi 存儲到 var1b    把數據轉換成                count                位二進制數字的一-
            茼r符串,以從低到高的次序表示成「1」和「0」字符的一-
            荍C。數據字節按從最先到最後的次序被檢索,並且在每-
            茼r節中按從低到高的次序接受(每)位。忽略在最後的字節中的任何額外的位。如果
            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                茪Q六進制數字的一-
            茼r符串,以從低到高的次序表示成一茼b    「0123456789abcdefABCDEF」
            (字符)集中的字符的一-
            荍C。按從最先到最後的次序檢索數據字節,並且在每-
            茼r節中以從低到高的次序接受十六進制數字。忽略最後的字節中的任何額外的位。如果
            count*,   則檢索在串中所有剩餘的十六進制數字。如果省略了
            count,則檢索一位十六進制數字。例如,
                   binary scan \x07\x86\x05 h3h* var1 var2
            將返回 2 並把 706 存儲到 var150 存儲到n var2.

       H    除了在每茼r節中以從高到低的次序接受數字之外,這種形式同於
            h。例如,
                   binary scan \x07\x86\x05 H3H* var1 var2
            將返回 2 並把 078 存儲到var105 存儲到 var2.

       c    把數據轉換成             count             8位有符號整數並作為一-
            茼C表存儲到相應的變量中。如果               count*,則檢索在串中所有剩餘的字節。如果省略了         count,則檢索一-
            8位整數。例如,
                   binary scan \x07\x86\x05 c2c* var1 var2
            將返回2  並把   7   -122   存儲到   var15   存儲到   var2.
            注意返回的整數是有符號的,但它怓O類似下-
            掖o樣的表達式來轉換成無符號的8位數量(quantity):
                   expr ( $num + 0x100 ) % 0x100

       s    把數據解釋成       count       茠磳頇陘p端字節序的16位有符號整數。
            整數被作為一茼C表存儲到相應的變量中。如果         count*,則檢索在串中所有剩餘的字節。如果省略了         count,則檢索一-
            16位整數。例如,
                   binary scan \x05\x00\x07\x00\xf0\xff s2s* var1 var2
            將返回   2   並把   5   7   存儲到   var1-16  存儲到  var2.
            注意返回的整數是有符號的,但它怓O類似下-
            掖o樣的表達式來轉換成無符號的16位數量(quantity):
                   expr ( $num + 0x10000 ) % 0x10000

       S    除了把數據解釋成                                             count
            茠磳頇陘j端字節序的16位有符號整數之外,這種形式同於 s。例如,
                   binary scan \x00\x05\x00\x07\xff\xf0 S2S* var1 var2
            將返回 2 並把 5 7 存儲到 var1-16 存儲到 var2.

       i    把數據解釋成       count       茠磳頇陘p端字節序的32位有符號整數。
            整數被作為一茼C表存儲到相應的變量中。如果         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 表示成無符號的C

       I    除了把數據解釋成                                             count
            茠磳頇陘j端字節序的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  蚞鷑馴誚a表示的單精度浮點數,把浮點數作為一-
            茼C表存儲到相應的變量中          。如果          count*,則檢索在串中所有剩餘的字節。如果省略了         count,則檢索一-
            茬皞諞蚽B點數。
            浮點數的大小在體系間可能不同,所以檢索的字節數也可能不同。如果數據不表示一-
            茼陵蘆滲B點數,結果O未定義的並且依賴於編譯器。例如,運行在 Intel
            Pentium 處理器的一 Windows 系統上,
                   binary scan \x3f\xcc\xcc\xcd f var1
            將返回 1,並把 1.6000000238418579 存儲到 var1d    除了把數據解釋成 count 蚞鷑馴誚a表示的雙精度浮點數之外,這種形式同
            於 f。例如,運行在 Intel Pentium 處理器的一 Windows 系統上,
                   binary scan \x9a\x99\x99\x99\x99\x99\xf9\x3f d var1
            將返回 1 ,並把 1.6000000000000001 存儲到 var11。

       xstring   中正向移動遊標   count   字節。如果   count*
            或比當前遊標位置之後的字節數大,則遊標定位到位置            string
            中的最後一茼r節之後。如果省略了count,則遊標正向移動一字節。  注意
            這種形式不消耗參數。例如,
                   binary scan \x01\x02\x03\x04 x2H* var1
            將返回 1,並把 0304 存儲到 var1Xstring   中反向移動遊標   count   字節。如果   count*
            或比當前遊標位置大,則遊標定位到位置      0,這樣下蚗阯薊漲r節將是
            string      中的第一茼r節。如果省略了count,則遊標反向移動一字節。
            注意這種形式不消耗參數。例如,
                   binary scan \x01\x02\x03\x04 c2XH* var1 var2
            將返回 2,並把 1 2 存儲到 var1020304 存儲到 var2@    在數據串中把遊標移動到由 countt  指定的絕對位置上。位置  0  參照在
            string    中的第一茼r節。如果    count    參照的位置超出    string
            的末端,則把遊標定位在最後的字節的後情C如果省略了 count,則產生一-
            蚇欞~。例如,  
                   binary scan \x01\x02\x03\x04 c2@1H* var1 var2
            將返回 2 ,並把 1 2 存儲到 var1 且 020304 存儲到 var2。

xy PLATFORM ISSUES
        有時希望以機器的本地字節序來格式化或檢索整數C參照       tcl_platform
       數組中的 byteOrder 元素來決定在格式化或檢索整數時使用那種類型字符。

 SEE ALSO
       format(n), scan(n), tclvars(n)

r KEYWORDS
       binary, format, scan

[]
      Hhh

[]
       2001/06/21

m Linux manUpn:
       http://cmpp.linuxforum.net