'\" '\" Copyright (c) 1997 by Sun Microsystems, Inc. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" '\" RCS: @(#) $Id: binary.n,v 1.2 2003/11/24 05:09:59 bbbush Exp $ '\" '\" The definitions below are for supplemental macros used in Tcl/Tk '\" manual entries. '\" '\" .AP type name in/out ?indent? '\" Start paragraph describing an argument to a library procedure. '\" type is type of argument (int, etc.), in/out is either "in", "out", '\" or "in/out" to describe whether procedure reads or modifies arg, '\" and indent is equivalent to second arg of .IP (shouldn't ever be '\" needed; use .AS below instead) '\" '\" .AS ?type? ?name? '\" Give maximum sizes of arguments for setting tab stops. Type and '\" name are examples of largest possible arguments that will be passed '\" to .AP later. If args are omitted, default tab stops are used. '\" '\" .BS '\" Start box enclosure. From here until next .BE, everything will be '\" enclosed in one large box. '\" '\" .BE '\" End of box enclosure. '\" '\" .CS '\" Begin code excerpt. '\" '\" .CE '\" End code excerpt. '\" '\" .VS ?version? ?br? '\" Begin vertical sidebar, for use in marking newly-changed parts '\" of man pages. The first argument is ignored and used for recording '\" the version when the .VS was added, so that the sidebars can be '\" found and removed when they reach a certain age. If another argument '\" is present, then a line break is forced before starting the sidebar. '\" '\" .VE '\" End of vertical sidebar. '\" '\" .DS '\" Begin an indented unfilled display. '\" '\" .DE '\" End of indented unfilled display. '\" '\" .SO '\" Start of list of standard options for a Tk widget. The '\" options follow on successive lines, in four columns separated '\" by tabs. '\" '\" .SE '\" End of list of standard options for a Tk widget. '\" '\" .OP cmdName dbName dbClass '\" Start of description of a specific option. cmdName gives the '\" option's name as specified in the class command, dbName gives '\" the option's name in the option database, and dbClass gives '\" the option's class in the option database. '\" '\" .UL arg1 arg2 '\" Print arg1 underlined, then print arg2 normally. '\" '\" RCS: @(#) $Id: binary.n,v 1.2 2003/11/24 05:09:59 bbbush Exp $ '\" '\" # Set up traps and other miscellaneous stuff for Tcl/Tk man pages. .if t .wh -1.3i ^B .nr ^l \n(.l .ad b '\" # Start an argument description .de AP .ie !"\\$4"" .TP \\$4 .el \{\ . ie !"\\$2"" .TP \\n()Cu . el .TP 15 .\} .ta \\n()Au \\n()Bu .ie !"\\$3"" \{\ \&\\$1 \\fI\\$2\\fP (\\$3) .\".b .\} .el \{\ .br .ie !"\\$2"" \{\ \&\\$1 \\fI\\$2\\fP .\} .el \{\ \&\\fI\\$1\\fP .\} .\} .. '\" # define tabbing values for .AP .de AS .nr )A 10n .if !"\\$1"" .nr )A \\w'\\$1'u+3n .nr )B \\n()Au+15n .\" .if !"\\$2"" .nr )B \\w'\\$2'u+\\n()Au+3n .nr )C \\n()Bu+\\w'(in/out)'u+2n .. .AS Tcl_Interp Tcl_CreateInterp in/out '\" # BS - start boxed text '\" # ^y = starting y location '\" # ^b = 1 .de BS .br .mk ^y .nr ^b 1u .if n .nf .if n .ti 0 .if n \l'\\n(.lu\(ul' .if n .fi .. '\" # BE - end boxed text (draw box now) .de BE .nf .ti 0 .mk ^t .ie n \l'\\n(^lu\(ul' .el \{\ .\" Draw four-sided box normally, but don't draw top of .\" box if the box started on an earlier page. .ie !\\n(^b-1 \{\ \h'-1.5n'\L'|\\n(^yu-1v'\l'\\n(^lu+3n\(ul'\L'\\n(^tu+1v-\\n(^yu'\l'|0u-1.5n\(ul' .\} .el \}\ \h'-1.5n'\L'|\\n(^yu-1v'\h'\\n(^lu+3n'\L'\\n(^tu+1v-\\n(^yu'\l'|0u-1.5n\(ul' .\} .\} .fi .br .nr ^b 0 .. '\" # VS - start vertical sidebar '\" # ^Y = starting y location '\" # ^v = 1 (for troff; for nroff this doesn't matter) .de VS .if !"\\$2"" .br .mk ^Y .ie n 'mc \s12\(br\s0 .el .nr ^v 1u .. '\" # VE - end of vertical sidebar .de VE .ie n 'mc .el \{\ .ev 2 .nf .ti 0 .mk ^t \h'|\\n(^lu+3n'\L'|\\n(^Yu-1v\(bv'\v'\\n(^tu+1v-\\n(^Yu'\h'-|\\n(^lu+3n' .sp -1 .fi .ev .\} .nr ^v 0 .. '\" # Special macro to handle page bottom: finish off current '\" # box/sidebar if in box/sidebar mode, then invoked standard '\" # page bottom macro. .de ^B .ev 2 'ti 0 'nf .mk ^t .if \\n(^b \{\ .\" Draw three-sided box if this is the box's first page, .\" draw two sides but no top otherwise. .ie !\\n(^b-1 \h'-1.5n'\L'|\\n(^yu-1v'\l'\\n(^lu+3n\(ul'\L'\\n(^tu+1v-\\n(^yu'\h'|0u'\c .el \h'-1.5n'\L'|\\n(^yu-1v'\h'\\n(^lu+3n'\L'\\n(^tu+1v-\\n(^yu'\h'|0u'\c .\} .if \\n(^v \{\ .nr ^x \\n(^tu+1v-\\n(^Yu \kx\h'-\\nxu'\h'|\\n(^lu+3n'\ky\L'-\\n(^xu'\v'\\n(^xu'\h'|0u'\c .\} .bp 'fi .ev .if \\n(^b \{\ .mk ^y .nr ^b 2 .\} .if \\n(^v \{\ .mk ^Y .\} .. '\" # DS - begin display .de DS .RS .nf .sp .. '\" # DE - end display .de DE .fi .RE .sp .. '\" # SO - start of list of standard options .de SO .SH "STANDARD OPTIONS" .LP .nf .ta 5.5c 11c .ft B .. '\" # SE - end of list of standard options .de SE .fi .ft R .LP See the \\fBoptions\\fR manual entry for details on the standard options. .. '\" # OP - start of full description for a single option .de OP .LP .nf .ta 4c Command-Line Name: \\fB\\$1\\fR Database Name: \\fB\\$2\\fR Database Class: \\fB\\$3\\fR .fi .IP .. '\" # CS - begin code excerpt .de CS .RS .nf .ta .25i .5i .75i 1i .. '\" # CE - end code excerpt .de CE .fi .RE .. .de UL \\$1\l'|0\(ul'\\$2 .. .TH binary 3tcl 8.0 Tcl "Tcl Built-In Commands" .BS '\" Note: do not modify the .SH NAME line immediately below! .SH NAME binary \- 從(向)二進位制串插入和提取欄位 .SH 總覽 SYNOPSIS \fBbinary format \fIformatString \fR?\fIarg arg ...\fR? .br \fBbinary scan \fIstring formatString \fR?\fIvarName varName ...\fR? .BE .SH 描述 DESCRIPTION .PP 這個命令提供操縱二進位制資料的設施。第一種形式是 \fBbinary format\fR,從普通的 Tcl 值來建立一個二進位制串。例如,給出值 16 和 22,可以產生一個8位元組的二進位制串,由兩個4位元組的整陣列成。第二種形式是 \fBbinary scan\fR,做相反的事: 從一個二進位制串中提取出資料並作為通常的 Tcl 字串值而返回。 .SH "二進位制化 BINARY FORMAT" .PP \fBbinary format\fR 命令生成一個二進位制串,其格式由 \fIformatString\fR 指定,它的內容來(自在後面)增添的引數。返回結果二進位制值。 .PP \fIformatString\fR 由零個或多個欄位說明符(specifier)的序列組成,用零個或多個空格分隔。每個說明符都是一個單獨的型別字元,跟隨著一個可選的數值 \fIcount\fR。多數字段說明符消耗(consume)一個引數來獲取被格式化的值。型別字元指定如何格式化值。\fIcount\fR 典型的指示從值中接受了多少個指定型別的單項(item)。如果\fIcount\fR 存在,則是一個非負十進位制整數或 \fB*\fR,星號通常指示使用在值中所有的單項。如果引數的個數不匹配在消耗引數的這些格式串中的欄位的個數,則產生一個錯誤。 .PP 每個型別-數目(type-count)對在二進位制串上移動一個假想的遊標,在當前的位置上儲存一些位元組並且遊標前進到最近儲存的位元組的緊後面。遊標初始在位置 0 也就是在資料的開始(端)。型別可以是下列字元中的任意一個: .IP \fBa\fR 5 在輸出串中儲存長度是 \fIcount\fR 的一個字串。如果 \fIarg\fR 比 \fIcount\fR 的位元組數少,則有增補的零位元組來填充欄位。如果 \fIarg\fR 比指定長度多,忽略額外的字元。如果 \fIcount\fR 是 \fB*\fR, 則格式化在 \fIarg\fR 中的所有位元組。如果省略了 \fIcount\fR ,則格式化一個字元。例如, .RS .CS \fBbinary format a7a*a alpha bravo charlie\fR .CE 將返回等價於 \fBalpha\\000\\000bravoc\fR的一個串。 .RE .IP \fBA\fR 5 除了使用空格而不是空字元來填充之外,這種形式同於 \fBa\fR。例如, .RS .CS \fBbinary format A6A*A alpha bravo charlie\fR .CE 將返回 \fBalpha bravoc\fR. .RE .IP \fBb\fR 5 在輸出串中儲存 \fIcount\fR 個二進位制數字的一個串,並且在每個位元組中以從低到高的次序(來排序)。\fIArg\fR 必須包含一個 \fB1\fR 和 \fB0\fR 字元的一個序列。以從最先到最後的次序散佈(emit)結果位元組,並且以在每個位元組中以從低到高的次序格式化每位。如果 \fIarg\fR 比 \fIcount\fR 的位數少,則剩餘的位使用零。如果 \fIarg\fR 比指定的位數多,忽略額外的位。如果 \fIcount\fR 是 \fB*\fR, 則格式化在 \fIarg\fR 中所有的位。如果省略了 \fIcount\fR,則格式化一位。如果如果格式化的位數不結束在位元組邊界上,最後的位元組的剩餘的位將是零。例如, .RS .CS \fBbinary format b5b* 11100 111000011010\fR .CE 將返回等價於 \fB\\x07\\x87\\x05\fR的一個串。 .RE .IP \fBB\fR 5 除了在每個位元組中以從高到低的次序(來排序)之外,這種形式同於 \fBb\fR。例如, .RS .CS \fBbinary format B5B* 11100 111000011010\fR .CE 將返回等價於 \fB\\xe0\\xe1\\xa0\fR的一個串。 .RE .IP \fBh\fR 5 在輸出串中儲存 \fIcount\fR 個十六進位制的數字的一個串,並且在每個位元組中以從低到高的次序(來排序)。\fIArg\fR 必須包含在“0123456789abcdefABCDEF”(字元)集中的字元的一個序列。以從最先到最後的次序散佈(emit)結果位元組,並且在每個位元組中以從低到高的次序格式化十六進位制數字。如果 \fIarg\fR 比 \fIcount\fR 的數字個數少,則剩餘的數字使用零。如果 \fIarg\fR 比指定的數字的個數多,忽略額外的數字。如果 \fIcount\fR 是 \fB*\fR,則格式化在 \fIarg\fR 中所有的數字。如果省略了 \fIcount\fR ,則格式化一個數字。如果格式化的數字的個數不結束在一個位元組的邊界上,最後的位元組的剩餘的位將是零。例如, .RS .CS \fBbinary format h3h* AB def\fR .CE 將返回等價於 \fB\\xba\\x00\\xed\\x0f\fR的一個串。 .RE .IP \fBH\fR 5 除了在每個位元組中以從高到低的次序(來排序)之外,這種形式同於 \fBh\fR 。例如, .RS .CS \fBbinary format H3H* ab DEF\fR .CE 將返回等價於 \fB\\xab\\x00\\xde\\xf0\fR的一個串。 .RE .IP \fBc\fR 5 在輸出串中儲存一個或多個8位整數值。如果未指定 \fIcount\fR,則 \fIarg\fR 必須包含一個整數值;否則 \fIarg\fR 必須包含至少有一個整數元素的一個列表。在當前的位置上把每個整數的低位(low-order)的 8 位儲存成一個一位元組的值。如果 \fIcount\fR 是 \fB*\fR,則格式化在列表中所有的整數。如果在列表中的元素的個數比 \fIcount\fR 少,則產生一個錯誤。 如果在列表中的元素的個數比 \fIcount\fR 多,則忽略額外的元素。例如, .RS .CS \fBbinary format c3cc* {3 -3 128 1} 260 {2 5}\fR .CE 將返回等價於 \fB\\x03\\xfd\\x80\\x04\\x02\\x05\fR 的一個串。而 .CS \fBbinary format c {2 5}\fR .CE 將產生一個錯誤。 .RE .IP \fBs\fR 5 除了以小端(little-endian)位元組序在輸出串中儲存一個或多個16位整數之外,這種形式同於 \fBc\fR。在當前位置上把每個整數的低位的16位儲存成一個兩位元組的值,並且首先儲存最低有效(significant)位元組。例如, .RS .CS \fBbinary format s3 {3 -3 258 1}\fR .CE 將返回等價於 \fB\\x03\\x00\\xfd\\xff\\x02\\x01\fR 的一個字串。 .RE .IP \fBS\fR 5 除了以大端(big-endian)位元組序在輸出串中儲存一個或多個16位整數之外,這種形式同於 \fBs\fR 。例如, .RS .CS \fBbinary format S3 {3 -3 258 1}\fR .CE 將返回等價於 \fB\\x00\\x03\\xff\\xfd\\x01\\x02\fR 的一個串。 .RE .IP \fBi\fR 5 除了以小端(little-endian)位元組序在輸出串中儲存一個或多個32位整數之外,這種形式同於 \fBc\fR。在當前位置上把每個整數的低位的32位儲存成一個四位元組的值,並且首先儲存最低有效位元組。例如, .RS .CS \fBbinary format i3 {3 -3 65536 1}\fR .CE 將返回等價於 \fB\\x03\\x00\\x00\\x00\\xfd\\xff\\xff\\xff\\x00\\x00\\x01\\x00\fR 的一個串。 .RE .IP \fBI\fR 5 除了以大端(big-endian)位元組序在輸出串中儲存一個或多個32位整數之外,這種形式同於 \fBi\fR。例如, .RS .CS \fBbinary format I3 {3 -3 65536 1}\fR .CE 將返回等價於 \fB\\x00\\x00\\x00\\x03\\xff\\xff\\xff\\xfd\\x00\\x01\\x00\\x00\fR 的一個串。 .RE .IP \fBf\fR 5 除了以機器的本地表示在輸出串中儲存一個或多個單精度浮點數之外,這種形式同於 \fBc\fR。這種表示是不能跨體系移植的,所以不應用於在網路上交流浮點數。浮點數的大小在體系間可能不同,所以生成的位元組數也可能不同。如果值溢位了機器的本地表示,則使用系統定義的 FLT_MAX 的值。因為 Tcl 在內部使用雙精度浮點數,在轉換成單精度時可能損失些精度。例如,執行在 Intel Pentium 處理器的一個 Windows 系統上, .RS .CS \fBbinary format f2 {1.6 3.4}\fR .CE 將返回等價於 \fB\\xcd\\xcc\\xcc\\x3f\\x9a\\x99\\x59\\x40\fR 的一個串。 .RE .IP \fBd\fR 5 除了以機器的本地表示在輸出串中儲存一個或多個雙精度浮點數之外,這種形式同於 \fBf\fR。例如,執行在 Intel Pentium 處理器的一個 Windows 系統上, .RS .CS \fBbinary format d1 {1.6}\fR .CE 將返回等價於 \fB\\x9a\\x99\\x99\\x99\\x99\\x99\\xf9\\x3f\fR 的一個串。 .RE .IP \fBx\fR 5 Stores \fIcount\fR null bytes in the output string. If \fIcount\fR is not specified, stores one null byte. If \fIcount\fR is \fB*\fR, generates an error. This type does not consume an argument. For example, .RS .CS \fBbinary format a3xa3x2a3 abc def ghi\fR .CE 將返回等價於 \fBabc\\000def\\000\\000ghi\fR 的一個串。 .RE .IP \fBX\fR 5 在輸出串中反向移動遊標 \fIcount\fR 位元組。如果 \fIcount\fR 是 \fB*\fR 或比當前遊標位置大,則遊標定位到位置 0,這樣下個儲存的位元組將是結果串中的第一個位元組。如果省略了\fIcount\fR,則遊標反向移動一位元組。 這種形式不使用引數。例如, .RS .CS \fBbinary format a3X*a3X2a3 abc def ghi\fR .CE 將返回 \fBdghi\fR. .RE .IP \fB@\fR 5 在輸出串中把遊標移動到由 \fIcount\fR 指定的絕對位置上。位置 0 參照在輸出串中的第一個位元組。如果 \fIcount\fR 參照的位置超出至今所儲存的最後的位元組,則在空擋的(unitialized ?)位置上放置空位元組並把遊標放置到指定位置。如果 \fIcount\fR 是 \fB*\fR,則遊標將被移動到輸出串的末端。如果省略了 \fIcount\fR,則產生一個錯誤。這種型別不使用引數。例如, .RS .CS \fBbinary format a5@2a1@*a3@10a1 abcde f ghi j\fR .CE 將返回 \fBabfdeghi\\000\\000j\fR. .RE .SH "二進位制檢索 BINARY SCAN" .PP \fBbinary scan\fR 命令從一個二進位制串分析欄位、返回完成的轉換的數目。\fIString\fR 給出要被分析的輸入而 \fIformatString\fR 指示如何分析它。每個 \fIvarName\fR 給出一個變數的名字;當從 \fIstring\fR 檢索出一個欄位時,結果被賦給相應的變數。 .PP 如同 \fBbinary format\fR 那樣,\fIformatString\fR 由零個或多個欄位說明符(specifier)的序列組成,用零個或多個空格分隔。每個說明符都是一個單獨的型別字元,跟隨著一個可選的數值 \fIcount\fR。多數字段說明符消耗(consume)一個引數來獲取檢索出的值要放置在其中的那個變數。型別字元指定如何解釋二進位制串。\fIcount\fR 典型的指定從資料中接受指定型別的多少個單項(item)。如果存在,\fIcount\fR 是一個非負數的十進位制整數或 \fB*\fR,星號通常指示要用到在資料中所有的剩餘的單項。如果在滿足當前欄位說明符的當前位置之後沒有剩下足夠的位元組,則相應的變數保持不動(untouch)而 \fBbinary scan\fR 立即返回設定了的變數的個數。如果沒有足夠的引數給所有這些消耗引數的格式串中的欄位,則產生一個錯誤。 .PP 著重 (\fBimportant\fR) 注意 \fBc\fR, \fBs\fR 和 \fBS\fR(還有在64位系統上的 \fBi\fR 和 \fBI\fRI)將被檢索成一個長整型 (long) 大小的值。在這種情況下,(最)高位設定(為1)的值(對於char 是 0x80,對於 short 是 0x8000,對於 int 是 0x80000000),將被符號擴充套件。所以下列情況將發生: .CS \fBset signShort [binary format s1 0x8000]\fR \fBbinary scan $signShort s1 val; \fI# val == 0xFFFF8000\fR .CE 如果你打算生成一個無符號值,那麼你可以把返回值遮蔽(mask)成需要的大小。例如,要生成一個無符號 short 值: .CS \fBset val [expr {$val & 0xFFFF}]; \fI# val == 0x8000\fR .CE .PP 每個型別-數目(type-count)對在二進位制串上移動一個假想的遊標,從當前的位置上讀一些位元組。遊標的初始在位置 0 也就是資料的開始(端)。型別可以是下列字元中的任意一個: .IP \fBa\fR 5 資料是長度是 \fIcount\fR 的一個字串。如果 \fIcount\fR 是 \fB*\fR,則在 string 中所有的剩餘的位元組將被檢索到變數中。如果省略了 \fIcount\fR,則將檢索一個字元。例如, .RS .CS \fBbinary scan abcde\\000fghi a6a10 var1 var2\fR .CE 將返回 \fB1\fR 並把等價於 \fBabcde\\000\fR 的一個字串儲存到 \fBvar1\fR 而 \fBvar2\fR 保持不變。 .RE .IP \fBA\fR 5 除了在儲存到變數之前從檢索到的值中去除(strip)尾隨的空白(blank)和空字元(null)之外,這種形式同於 \fBa\fR。例如 .RS .CS \fBbinary scan "abc efghi \\000" A* var1\fR .CE 將返回 \fB1\fR 並把 \fBabc efghi\fR 儲存到 \fBvar1\fR。 .RE .IP \fBb\fR 5 把資料轉換成 \fIcount\fR 位二進位制數字的一個字串,以從低到高的次序表示成“1”和“0”字元的一個序列。資料位元組按從最先到最後的次序被檢索,並且在每個位元組中按從低到高的次序接受(每)位。忽略在最後的位元組中的任何額外的位。如果 \fIcount\fR 是 \fB*\fR,則檢索在串中的所有的剩餘的位。 如果省略了 \fIcount\fR,則檢索一位。例如, .RS .CS \fBbinary scan \\x07\\x87\\x05 b5b* var1 var2\fR .CE 將返回 \fB2\fR 並把 \fB11100\fR 儲存到 \fBvar1\fR 且 \fB1110000110100000\fR 儲存到 \fBvar2\fR. .RE .IP \fBB\fR 5 除了在每位元組中按從高到低的次序接受(每)位之外,這種形式同於 \fBb\fR。例如, .RS .CS \fBbinary scan \\x70\\x87\\x05 B5B* var1 var2\fR .CE 將返回 \fB2\fR 並把 \fB01110\fR 儲存到 \fBvar1\fR 且 \fB1000011100000101\fR 儲存到 \fBvar2\fR. .RE .IP \fBh\fR 5 把資料轉換成 \fIcount\fR 個十六進位制數字的一個字串,以從低到高的次序表示成一個在 “0123456789abcdefABCDEF” (字元)集中的字元的一個序列。按從最先到最後的次序檢索資料位元組,並且在每個位元組中以從低到高的次序接受十六進位制數字。忽略最後的位元組中的任何額外的位。如果 \fIcount\fR 是 \fB*\fR, 則檢索在串中所有剩餘的十六進位制數字。如果省略了 \fIcount\fR,則檢索一位十六進位制數字。例如, .RS .CS \fBbinary scan \\x07\\x86\\x05 h3h* var1 var2\fR .CE 將返回 \fB2\fR 並把 \fB706\fR 儲存到 \fBvar1\fR 且 \fB50\fR 儲存到n \fBvar2\fR. .RE .IP \fBH\fR 5 除了在每個位元組中以從高到低的次序接受數字之外,這種形式同於 \fBh\fR。例如, .RS .CS \fBbinary scan \\x07\\x86\\x05 H3H* var1 var2\fR .CE 將返回 \fB2\fR 並把 \fB078\fR 儲存到\fBvar1\fR 且 \fB05\fR 儲存到 \fBvar2\fR. .RE .IP \fBc\fR 5 把資料轉換成 \fIcount\fR 個8位有符號整數並作為一個列表儲存到相應的變數中。如果 \fIcount\fR 是 \fB*\fR,則檢索在串中所有剩餘的位元組。如果省略了 \fIcount\fR,則檢索一個8位整數。例如, .RS .CS \fBbinary scan \\x07\\x86\\x05 c2c* var1 var2\fR .CE 將返回\fB2\fR 並把 \fB7 -122\fR 儲存到 \fBvar1\fR 且 \fB5\fR 儲存到 \fBvar2\fR. 注意返回的整數是有符號的,但它們是類似下面這樣的表示式來轉換成無符號的8位數量(quantity): .CS \fBexpr ( $num + 0x100 ) % 0x100\fR .CE .RE .IP \fBs\fR 5 把資料解釋成 \fIcount\fR 個表示為小端位元組序的16位有符號整數。 整數被作為一個列表儲存到相應的變數中。如果 \fIcount\fR 是 \fB*\fR,則檢索在串中所有剩餘的位元組。如果省略了 \fIcount\fR,則檢索一個16位整數。例如, .RS .CS \fBbinary scan \\x05\\x00\\x07\\x00\\xf0\\xff s2s* var1 var2\fR .CE 將返回 \fB2\fR 並把 \fB5 7\fR 儲存到 \fBvar1\fR 且 \fB-16\fR 儲存到 \fBvar2\fR. 注意返回的整數是有符號的,但它們是類似下面這樣的表示式來轉換成無符號的16位數量(quantity): .CS \fBexpr ( $num + 0x10000 ) % 0x10000\fR .CE .RE .IP \fBS\fR 5 除了把資料解釋成 \fIcount\fR 個表示為大端位元組序的16位有符號整數之外,這種形式同於 \fBs\fR。例如, .RS .CS \fBbinary scan \\x00\\x05\\x00\\x07\\xff\\xf0 S2S* var1 var2\fR .CE 將返回 \fB2\fR 並把 \fB5 7\fR 儲存到 \fBvar1\fR 且 \fB-16\fR 儲存到 \fBvar2\fR. .RE .IP \fBi\fR 5 把資料解釋成 \fIcount\fR 個表示為小端位元組序的32位有符號整數。 整數被作為一個列表儲存到相應的變數中。如果 \fIcount\fR 是 \fB*\fR,則檢索在串中所有剩餘的位元組。如果省略了 \fIcount\fR,則檢索一個32位整數。例如, .RS .CS \fBbinary scan \\x05\\x00\\x00\\x00\\x07\\x00\\x00\\x00\\xf0\\xff\\xff\\xff i2i* var1 var2\fR .CE 將返回 \fB2\fR ,並把 \fB5 7\fR 儲存到 \fBvar1\fR 且 \fB-16\fR 儲存到 \fBvar2\fR。注意返回的整數是有符號的並且不能被 Tcl 表示成無符號的值。 .RE .IP \fBI\fR 5 除了把資料解釋成 \fIcount\fR 個表示為大端位元組序的32位有符號整數之外,這種形式同於 \fBi\fR。例如, .RS .CS \fBbinary \\x00\\x00\\x00\\x05\\x00\\x00\\x00\\x07\\xff\\xff\\xff\\xf0 I2I* var1 var2\fR .CE 將返回 \fB2\fR ,並把 \fB5 7\fR 儲存到 \fBvar1\fR 且 \fB-16\fR 儲存到 \fBvar2\fR。 .RE .IP \fBf\fR 5 把資料解釋成 \fIcount\fR 個機器本地表示的單精度浮點數,把浮點數作為一個列表儲存到相應的變數中 。如果 \fIcount\fR 是 \fB*\fR,則檢索在串中所有剩餘的位元組。如果省略了 \fIcount\fR,則檢索一個單精度浮點數。 浮點數的大小在體系間可能不同,所以檢索的位元組數也可能不同。如果資料不表示一個有效的浮點數,結果值是未定義的並且依賴於編譯器。例如,執行在 Intel Pentium 處理器的一個 Windows 系統上, .RS .CS \fBbinary scan \\x3f\\xcc\\xcc\\xcd f var1\fR .CE 將返回 \fB1\fR,並把 \fB1.6000000238418579\fR 儲存到 \fBvar1\fR。 .RE .IP \fBd\fR 5 除了把資料解釋成 \fIcount\fR 個機器本地表示的雙精度浮點數之外,這種形式同 於 \fBf\fR。例如,執行在 Intel Pentium 處理器的一個 Windows 系統上, .RS .CS \fBbinary scan \\x9a\\x99\\x99\\x99\\x99\\x99\\xf9\\x3f d var1\fR .CE 將返回 \fB1\fR ,並把 \fB1.6000000000000001\fR 儲存到 \fBvar1\fR1。 .RE .IP \fBx\fR 5 在 \fIstring\fR 中正向移動遊標 \fIcount\fR 位元組。如果 \fIcount\fR 是 \fB*\fR 或比當前遊標位置之後的位元組數大,則遊標定位到位置 \fIstring\fR 中的最後一個位元組之後。如果省略了\fIcount\fR,則遊標正向移動一位元組。 注意 這種形式不消耗引數。例如, .RS .CS \fBbinary scan \\x01\\x02\\x03\\x04 x2H* var1\fR .CE 將返回 \fB1\fR,並把 \fB0304\fR 儲存到 \fBvar1\fR。 .RE .IP \fBX\fR 5 在 \fIstring\fR 中反向移動遊標 \fIcount\fR 位元組。如果 \fIcount\fR 是 \fB*\fR 或比當前遊標位置大,則遊標定位到位置 0,這樣下個檢索的位元組將是 \fIstring\fR 中的第一個位元組。如果省略了\fIcount\fR,則遊標反向移動一位元組。 注意這種形式不消耗引數。例如, .RS .CS \fBbinary scan \\x01\\x02\\x03\\x04 c2XH* var1 var2\fR .CE 將返回 \fB2\fR,並把 \fB1 2\fR 儲存到 \fBvar1\fR 且 \fB020304\fR 儲存到 \fBvar2\fR。 .RE .IP \fB@\fR 5 在資料串中把遊標移動到由 \fIcount\fRt 指定的絕對位置上。位置 0 參照在 \fIstring\fR 中的第一個位元組。如果 \fIcount\fR 參照的位置超出 \fIstring\fR 的末端,則把遊標定位在最後的位元組的後面。如果省略了 \fIcount\fR,則產生一個錯誤。例如,   .RS .CS \fBbinary scan \\x01\\x02\\x03\\x04 c2@1H* var1 var2\fR .CE 將返回 2 ,並把 1 2 儲存到 var1 且 020304 儲存到 var2。 .RE .SH "平臺相關事宜 PLATFORM ISSUES" 有時希望以機器的本地位元組序來格式化或檢索整數值。參照 \fBtcl_platform\fR 陣列中的 \fBbyteOrder\fR 元素來決定在格式化或檢索整數時使用那種型別字元。 .SH "參見 SEE ALSO" format(n), scan(n), tclvars(n) .SH 關鍵字 KEYWORDS binary, format, scan .SH "[中文版維護人]" .B 寒蟬退士 .SH "[中文版最新更新]" .B 2001/06/21 .SH "《中國 Linux 論壇 man 手冊頁翻譯計劃》:" .BI http://cmpp.linuxforum.net .SH "跋" .br 本頁面中文版由中文 man 手冊頁計劃提供。 .br 中文 man 手冊頁計劃:\fBhttps://github.com/man-pages-zh/manpages-zh\fR