日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時(shí)間:2023/12/15 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 binary - 从(向)二进制串插入和提取字段 / BINARY FORMAT BINARY SCAN 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
binary - 從(向)二進(jìn)制串插入和提取字段??? SYNOPSISbinary format formatString ?arg arg ...?binary scan string formatString ?varName varName ...? _________________________________________________________________??? DESCRIPTION這個(gè)命令提供操縱二進(jìn)制數(shù)據(jù)的設(shè)施。第一種形式是 binary format,從普通的Tcl 值來(lái)建立一個(gè)二進(jìn)制串。例如,給出值 16 和22,可以產(chǎn)生一個(gè)8字節(jié)的二進(jìn)制串,由兩個(gè)4字節(jié)的整數(shù)組成。第二種形式是binary scan,做相反的事: 從一個(gè)二進(jìn)制串中提取出數(shù)據(jù)并作為通常的 Tcl字符串值而返回。????? BINARY FORMATbinary format 命令生成一個(gè)二進(jìn)制串,其格式由 formatString指定,它的內(nèi)容來(lái)(自在后面)增添的參數(shù)。返回結(jié)果二進(jìn)制值。formatString由零個(gè)或多個(gè)字段說(shuō)明符(specifier)的序列組成,用零個(gè)或多個(gè)空格分隔。每個(gè)說(shuō)明符都是一個(gè)單獨(dú)的類型字符,跟隨著一個(gè)可選的數(shù)值count。多數(shù)字段說(shuō)明符消耗(consume)一個(gè)參數(shù)來(lái)獲取被格式化的值。類型字符指定如何格式化值。count典型的指示從值中接受了多少個(gè)指定類型的單項(xiàng)(item)。如果count存在,則是一個(gè)非負(fù)十進(jìn)制整數(shù)或*,星號(hào)通常指示使用在值中所有的單項(xiàng)。如果參數(shù)的個(gè)數(shù)不匹配在消耗參數(shù)的這些格式串中的字段的個(gè)數(shù),則產(chǎn)生一個(gè)錯(cuò)誤。每個(gè)類型-數(shù)目(type-count)對(duì)在二進(jìn)制串上移動(dòng)一個(gè)假想的游標(biāo),在當(dāng)前的位置上存儲(chǔ)一些字節(jié)并且游標(biāo)前進(jìn)到最近存儲(chǔ)的字節(jié)的緊后面。游標(biāo)初始在位置0 也就是在數(shù)據(jù)的開始(端)。類型可以是下列字符中的任意一個(gè):a 在輸出串中存儲(chǔ)長(zhǎng)度是 count 的一個(gè)字符串。如果 arg 比 count的字節(jié)數(shù)少,則有增補(bǔ)的零字節(jié)來(lái)填充字段。如果 arg比指定長(zhǎng)度多,忽略額外的字符。如果 count 是 *, 則格式化在 arg中的所有字節(jié)。如果省略了 count ,則格式化一個(gè)字符。例如,binary format a7a*a alpha bravo charlie將返回等價(jià)于 alpha\000\000bravoc的一個(gè)串。A 除了使用空格而不是空字符來(lái)填充之外,這種形式同于 a。例如,binary format A6A*A alpha bravo charlie將返回 alpha bravoc.b 在輸出串中存儲(chǔ) count個(gè)二進(jìn)制數(shù)字的一個(gè)串,并且在每個(gè)字節(jié)中以從低到高的次序(來(lái)排序)。Arg必須包含一個(gè) 1 和 0字符的一個(gè)序列。以從最先到最后的次序散布(emit)結(jié)果字節(jié),并且以在每個(gè)字節(jié)中以從低到高的次序格式化每位。如果arg 比 count 的位數(shù)少,則剩余的位使用零。如果 arg比指定的位數(shù)多,忽略額外的位。如果 count 是 *, 則格式化在 arg中所有的位。如果省略了count,則格式化一位。如果如果格式化的位數(shù)不結(jié)束在字節(jié)邊界上,最后的字節(jié)的剩余的位將是零。例如,binary format b5b* 11100 111000011010將返回等價(jià)于 \x07\x87\x05的一個(gè)串。B 除了在每個(gè)字節(jié)中以從高到低的次序(來(lái)排序)之外,這種形式同于b。例如,binary format B5B* 11100 111000011010將返回等價(jià)于 \xe0\xe1\xa0的一個(gè)串。h 在輸出串中存儲(chǔ) count個(gè)十六進(jìn)制的數(shù)字的一個(gè)串,并且在每個(gè)字節(jié)中以從低到高的次序(來(lái)排序)。Arg必須包含在“0123456789abcdefABCDEF”(字符)集中的字符的一個(gè)序列。以從最先到最后的次序散布(emit)結(jié)果字節(jié),并且在每個(gè)字節(jié)中以從低到高的次序格式化十六進(jìn)制數(shù)字。如果arg 比 count 的數(shù)字個(gè)數(shù)少,則剩余的數(shù)字使用零。如果 arg比指定的數(shù)字的個(gè)數(shù)多,忽略額外的數(shù)字。如果 count 是 *,則格式化在arg 中所有的數(shù)字。如果省略了 count,則格式化一個(gè)數(shù)字。如果格式化的數(shù)字的個(gè)數(shù)不結(jié)束在一個(gè)字節(jié)的邊界上,最后的字節(jié)的剩余的位將是零。例如,binary format h3h* AB def將返回等價(jià)于 \xba\x00\xed\x0f的一個(gè)串。H 除了在每個(gè)字節(jié)中以從高到低的次序(來(lái)排序)之外,這種形式同于 h。例如,binary format H3H* ab DEF將返回等價(jià)于 \xab\x00\xde\xf0的一個(gè)串。c 在輸出串中存儲(chǔ)一個(gè)或多個(gè)8位整數(shù)值。如果未指定 count,則 arg必須包含一個(gè)整數(shù)值;否則 arg必須包含至少有一個(gè)整數(shù)元素的一個(gè)列表。在當(dāng)前的位置上把每個(gè)整數(shù)的低位(low-order)的 8 位存儲(chǔ)成一個(gè)一字節(jié)的值。如果 count 是*,則格式化在列表中所有的整數(shù)。如果在列表中的元素的個(gè)數(shù)比 count少,則產(chǎn)生一個(gè)錯(cuò)誤。 如果在列表中的元素的個(gè)數(shù)比 count多,則忽略額外的元素。例如,binary format c3cc* {3 -3 128 1} 260 {2 5}將返回等價(jià)于 \x03\xfd\x80\x04\x02\x05 的一個(gè)串。而binary format c {2 5}將產(chǎn)生一個(gè)錯(cuò)誤。s 除了以小端(little-endian)字節(jié)序在輸出串中存儲(chǔ)一個(gè)或多個(gè)16位整數(shù)之外,這種形式同于c。在當(dāng)前位置上把每個(gè)整數(shù)的低位的16位存儲(chǔ)成一個(gè)兩字節(jié)的值,并且首先存儲(chǔ)最低有效(significant)字節(jié)。例如,binary format s3 {3 -3 258 1}將返回等價(jià)于 \x03\x00\xfd\xff\x02\x01 的一個(gè)字串。S 除了以大端(big-endian)字節(jié)序在輸出串中存儲(chǔ)一個(gè)或多個(gè)16位整數(shù)之外,這種形式同于 s。例如,binary format S3 {3 -3 258 1}將返回等價(jià)于 \x00\x03\xff\xfd\x01\x02 的一個(gè)串。i 除了以小端(little-endian)字節(jié)序在輸出串中存儲(chǔ)一個(gè)或多個(gè)32位整數(shù)之外,這種形式同于c。在當(dāng)前位置上把每個(gè)整數(shù)的低位的32位存儲(chǔ)成一個(gè)四字節(jié)的值,并且首先存儲(chǔ)最低有效字節(jié)。例如,binary format i3 {3 -3 65536 1}將返回等價(jià)于 \x03\x00\x00\x00\xfd\xff\xff\xff\x00\x00\x01\x00的一個(gè)串。I 除了以大端(big-endian)字節(jié)序在輸出串中存儲(chǔ)一個(gè)或多個(gè)32位整數(shù)之外,這種形式同于i。例如,binary format I3 {3 -3 65536 1}將返回等價(jià)于 \x00\x00\x00\x03\xff\xff\xff\xfd\x00\x01\x00\x00的一個(gè)串。f 除了以機(jī)器的本地表示在輸出串中存儲(chǔ)一個(gè)或多個(gè)單精度浮點(diǎn)數(shù)之外,這種形式同于c。這種表示是不能跨體系移植的,所以不應(yīng)用于在網(wǎng)絡(luò)上交流浮點(diǎn)數(shù)。浮點(diǎn)數(shù)的大小在體系間可能不同,所以生成的字節(jié)數(shù)也可能不同。如果值溢出了機(jī)器的本地表示,則使用系統(tǒng)定義的FLT_MAX 的值。因?yàn)? Tcl在內(nèi)部使用雙精度浮點(diǎn)數(shù),在轉(zhuǎn)換成單精度時(shí)可能損失些精度。例如,運(yùn)行在Intel Pentium 處理器的一個(gè) Windows 系統(tǒng)上,binary format f2 {1.6 3.4}將返回等價(jià)于 \xcd\xcc\xcc\x3f\x9a\x99\x59\x40 的一個(gè)串。d 除了以機(jī)器的本地表示在輸出串中存儲(chǔ)一個(gè)或多個(gè)雙精度浮點(diǎn)數(shù)之外,這種形式同于f。例如,運(yùn)行在 Intel Pentium 處理器的一個(gè) Windows 系統(tǒng)上,binary format d1 {1.6}將返回等價(jià)于 \x9a\x99\x99\x99\x99\x99\xf9\x3f 的一個(gè)串。x Stores count null bytes in the output string. If count is notspecified, stores one null byte. If count is *, generates anerror. This type does not consume an argument. For example,binary format a3xa3x2a3 abc def ghi將返回等價(jià)于 abc\000def\000\000ghi 的一個(gè)串。X 在輸出串中反向移動(dòng)游標(biāo) count 字節(jié)。如果 count 是 *或比當(dāng)前游標(biāo)位置大,則游標(biāo)定位到位置0,這樣下個(gè)存儲(chǔ)的字節(jié)將是結(jié)果串中的第一個(gè)字節(jié)。如果省略了count,則游標(biāo)反向移動(dòng)一字節(jié)。這種形式不使用參數(shù)。例如,binary format a3X*a3X2a3 abc def ghi將返回 dghi.@ 在輸出串中把游標(biāo)移動(dòng)到由 count 指定的絕對(duì)位置上。位置 0參照在輸出串中的第一個(gè)字節(jié)。如果 count參照的位置超出至今所存儲(chǔ)的最后的字節(jié),則在空擋的(unitialized?)位置上放置空字節(jié)并把游標(biāo)放置到指定位置。如果 count 是*,則游標(biāo)將被移動(dòng)到輸出串的末端。如果省略了count,則產(chǎn)生一個(gè)錯(cuò)誤。這種類型不使用參數(shù)。例如,binary format a5@2a1@*a3@10a1 abcde f ghi j將返回 abfdeghi\000\000j.??????? BINARY SCANbinary scan 命令從一個(gè)二進(jìn)制串分析字段、返回完成的轉(zhuǎn)換的數(shù)目。String給出要被分析的輸入而 formatString 指示如何分析它。每個(gè) varName給出一個(gè)變量的名字;當(dāng)從 string檢索出一個(gè)字段時(shí),結(jié)果被賦給相應(yīng)的變量。如同 binary format 那樣,formatString由零個(gè)或多個(gè)字段說(shuō)明符(specifier)的序列組成,用零個(gè)或多個(gè)空格分隔。每個(gè)說(shuō)明符都是一個(gè)單獨(dú)的類型字符,跟隨著一個(gè)可選的數(shù)值count。多數(shù)字段說(shuō)明符消耗(consume)一個(gè)參數(shù)來(lái)獲取檢索出的值要放置在其中的那個(gè)變量。類型字符指定如何解釋二進(jìn)制串。count典型的指定從數(shù)據(jù)中接受指定類型的多少個(gè)單項(xiàng)(item)。如果存在,count是一個(gè)非負(fù)數(shù)的十進(jìn)制整數(shù)或*,星號(hào)通常指示要用到在數(shù)據(jù)中所有的剩余的單項(xiàng)。如果在滿足當(dāng)前字段說(shuō)明符的當(dāng)前位置之后沒有剩下足夠的字節(jié),則相應(yīng)的變量保持不動(dòng)(untouch)而binary scan立即返回設(shè)置了的變量的個(gè)數(shù)。如果沒有足夠的參數(shù)給所有這些消耗參數(shù)的格式串中的字段,則產(chǎn)生一個(gè)錯(cuò)誤。著重 (important) 注意 c, s 和 S(還有在64位系統(tǒng)上的 i 和II)將被檢索成一個(gè)長(zhǎng)整型 (long)大小的值。在這種情況下,(最)高位設(shè)置(為1)的值(對(duì)于char 是 0x80,對(duì)于short 是 0x8000,對(duì)于 int 是0x80000000),將被符號(hào)擴(kuò)展。所以下列情況將發(fā)生:set signShort [binary format s1 0x8000]binary scan $signShort s1 val; # val == 0xFFFF8000如果你打算生成一個(gè)無(wú)符號(hào)值,那么你可以把返回值屏蔽(mask)成需要的大小。例如,要生成一個(gè)無(wú)符號(hào)short 值:set val [expr {$val & 0xFFFF}]; # val == 0x8000每個(gè)類型-數(shù)目(type-count)對(duì)在二進(jìn)制串上移動(dòng)一個(gè)假想的游標(biāo),從當(dāng)前的位置上讀一些字節(jié)。游標(biāo)的初始在位置0 也就是數(shù)據(jù)的開始(端)。類型可以是下列字符中的任意一個(gè):a 數(shù)據(jù)是長(zhǎng)度是 count 的一個(gè)字符串。如果 count 是 *,則在 string中所有的剩余的字節(jié)將被檢索到變量中。如果省略了count,則將檢索一個(gè)字符。例如,binary scan abcde\000fghi a6a10 var1 var2將返回 1 并把等價(jià)于 abcde\000 的一個(gè)字符串存儲(chǔ)到 var1 而 var2保持不變。A 除了在存儲(chǔ)到變量之前從檢索到的值中去除(strip)尾隨的空白(blank)和空字符(null)之外,這種形式同于a。例如binary scan "abc efghi \000" A* var1將返回 1 并把 abc efghi 存儲(chǔ)到 var1。b 把數(shù)據(jù)轉(zhuǎn)換成 count位二進(jìn)制數(shù)字的一個(gè)字符串,以從低到高的次序表示成“1”和“0”字符的一個(gè)序列。數(shù)據(jù)字節(jié)按從最先到最后的次序被檢索,并且在每個(gè)字節(jié)中按從低到高的次序接受(每)位。忽略在最后的字節(jié)中的任何額外的位。如果count 是 *,則檢索在串中的所有的剩余的位。 如果省略了count,則檢索一位。例如,binary scan \x07\x87\x05 b5b* var1 var2將返回 2 并把 11100 存儲(chǔ)到 var1 且 1110000110100000 存儲(chǔ)到 var2.B 除了在每字節(jié)中按從高到低的次序接受(每)位之外,這種形式同于b。例如,binary scan \x70\x87\x05 B5B* var1 var2將返回 2 并把 01110 存儲(chǔ)到 var1 且 1000011100000101 存儲(chǔ)到 var2.h 把數(shù)據(jù)轉(zhuǎn)換成 count個(gè)十六進(jìn)制數(shù)字的一個(gè)字符串,以從低到高的次序表示成一個(gè)在“0123456789abcdefABCDEF”(字符)集中的字符的一個(gè)序列。按從最先到最后的次序檢索數(shù)據(jù)字節(jié),并且在每個(gè)字節(jié)中以從低到高的次序接受十六進(jìn)制數(shù)字。忽略最后的字節(jié)中的任何額外的位。如果count 是 *, 則檢索在串中所有剩余的十六進(jìn)制數(shù)字。如果省略了count,則檢索一位十六進(jìn)制數(shù)字。例如,binary scan \x07\x86\x05 h3h* var1 var2將返回 2 并把 706 存儲(chǔ)到 var1 且 50 存儲(chǔ)到n var2.H 除了在每個(gè)字節(jié)中以從高到低的次序接受數(shù)字之外,這種形式同于h。例如,binary scan \x07\x86\x05 H3H* var1 var2將返回 2 并把 078 存儲(chǔ)到var1 且 05 存儲(chǔ)到 var2.c 把數(shù)據(jù)轉(zhuǎn)換成 count個(gè)8位有符號(hào)整數(shù)并作為一個(gè)列表存儲(chǔ)到相應(yīng)的變量中。如果 count 是*,則檢索在串中所有剩余的字節(jié)。如果省略了count,則檢索一個(gè)8位整數(shù)。例如,binary scan \x07\x86\x05 c2c* var1 var2將返回2 并把 7 -122 存儲(chǔ)到 var1 且 5 存儲(chǔ)到 var2.注意返回的整數(shù)是有符號(hào)的,但它們是類似下面這樣的表達(dá)式來(lái)轉(zhuǎn)換成無(wú)符號(hào)的8位數(shù)量(quantity):expr ( $num + 0x100 ) % 0x100s 把數(shù)據(jù)解釋成 count 個(gè)表示為小端字節(jié)序的16位有符號(hào)整數(shù)。整數(shù)被作為一個(gè)列表存儲(chǔ)到相應(yīng)的變量中。如果 count 是*,則檢索在串中所有剩余的字節(jié)。如果省略了count,則檢索一個(gè)16位整數(shù)。例如,binary scan \x05\x00\x07\x00\xf0\xff s2s* var1 var2將返回 2 并把 5 7 存儲(chǔ)到 var1 且 -16 存儲(chǔ)到 var2.注意返回的整數(shù)是有符號(hào)的,但它們是類似下面這樣的表達(dá)式來(lái)轉(zhuǎn)換成無(wú)符號(hào)的16位數(shù)量(quantity):expr ( $num + 0x10000 ) % 0x10000S 除了把數(shù)據(jù)解釋成 count個(gè)表示為大端字節(jié)序的16位有符號(hào)整數(shù)之外,這種形式同于 s。例如,binary scan \x00\x05\x00\x07\xff\xf0 S2S* var1 var2將返回 2 并把 5 7 存儲(chǔ)到 var1 且 -16 存儲(chǔ)到 var2.i 把數(shù)據(jù)解釋成 count 個(gè)表示為小端字節(jié)序的32位有符號(hào)整數(shù)。整數(shù)被作為一個(gè)列表存儲(chǔ)到相應(yīng)的變量中。如果 count 是*,則檢索在串中所有剩余的字節(jié)。如果省略了count,則檢索一個(gè)32位整數(shù)。例如,binary scan \x05\x00\x00\x00\x07\x00\x00\x00\xf0\xff\xff\xff i2i* var1 var2將返回 2 ,并把 5 7 存儲(chǔ)到 var1 且 -16 存儲(chǔ)到var2。注意返回的整數(shù)是有符號(hào)的并且不能被 Tcl 表示成無(wú)符號(hào)的值。I 除了把數(shù)據(jù)解釋成 count個(gè)表示為大端字節(jié)序的32位有符號(hào)整數(shù)之外,這種形式同于 i。例如,binary \x00\x00\x00\x05\x00\x00\x00\x07\xff\xff\xff\xf0 I2I* var1 var2將返回 2 ,并把 5 7 存儲(chǔ)到 var1 且 -16 存儲(chǔ)到 var2。f 把數(shù)據(jù)解釋成 count個(gè)機(jī)器本地表示的單精度浮點(diǎn)數(shù),把浮點(diǎn)數(shù)作為一個(gè)列表存儲(chǔ)到相應(yīng)的變量中。如果 count 是 *,則檢索在串中所有剩余的字節(jié)。如果省略了count,則檢索一個(gè)單精度浮點(diǎn)數(shù)。浮點(diǎn)數(shù)的大小在體系間可能不同,所以檢索的字節(jié)數(shù)也可能不同。如果數(shù)據(jù)不表示一個(gè)有效的浮點(diǎn)數(shù),結(jié)果值是未定義的并且依賴于編譯器。例如,運(yùn)行在Intel Pentium 處理器的一個(gè) Windows 系統(tǒng)上,binary scan \x3f\xcc\xcc\xcd f var1將返回 1,并把 1.6000000238418579 存儲(chǔ)到 var1。d 除了把數(shù)據(jù)解釋成 count個(gè)機(jī)器本地表示的雙精度浮點(diǎn)數(shù)之外,這種形式同 于 f。例如,運(yùn)行在Intel Pentium 處理器的一個(gè) Windows 系統(tǒng)上,binary scan \x9a\x99\x99\x99\x99\x99\xf9\x3f d var1將返回 1 ,并把 1.6000000000000001 存儲(chǔ)到 var11。x 在 string 中正向移動(dòng)游標(biāo) count 字節(jié)。如果 count 是 *或比當(dāng)前游標(biāo)位置之后的字節(jié)數(shù)大,則游標(biāo)定位到位置 string中的最后一個(gè)字節(jié)之后。如果省略了count,則游標(biāo)正向移動(dòng)一字節(jié)。 注意這種形式不消耗參數(shù)。例如,binary scan \x01\x02\x03\x04 x2H* var1將返回 1,并把 0304 存儲(chǔ)到 var1。X 在 string 中反向移動(dòng)游標(biāo) count 字節(jié)。如果 count 是 *或比當(dāng)前游標(biāo)位置大,則游標(biāo)定位到位置 0,這樣下個(gè)檢索的字節(jié)將是string 中的第一個(gè)字節(jié)。如果省略了count,則游標(biāo)反向移動(dòng)一字節(jié)。注意這種形式不消耗參數(shù)。例如,binary scan \x01\x02\x03\x04 c2XH* var1 var2將返回 2,并把 1 2 存儲(chǔ)到 var1 且 020304 存儲(chǔ)到 var2。@ 在數(shù)據(jù)串中把游標(biāo)移動(dòng)到由 countt 指定的絕對(duì)位置上。位置 0 參照在string 中的第一個(gè)字節(jié)。如果 count 參照的位置超出 string的末端,則把游標(biāo)定位在最后的字節(jié)的后面。如果省略了count,則產(chǎn)生一個(gè)錯(cuò)誤。例如,  binary scan \x01\x02\x03\x04 c2@1H* var1 var2將返回 2 ,并把 1 2 存儲(chǔ)到 var1 且 020304 存儲(chǔ)到 var2。??????????? PLATFORM ISSUES有時(shí)希望以機(jī)器的本地字節(jié)序來(lái)格式化或檢索整數(shù)值。參照 tcl_platform數(shù)組中的 byteOrder 元素來(lái)決定在格式化或檢索整數(shù)時(shí)使用那種類型字符。

總結(jié)

以上是生活随笔為你收集整理的binary - 从(向)二进制串插入和提取字段 / BINARY FORMAT BINARY SCAN的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。