[形式] binary format template ?value value ...? |
templateは、タイプとカウント数から成ります。
binary formatコマンドは、バイナリデータを返します。
templateに指定するタイプには以下のものがあります。
※以下の例のバイナリデータは、バイナリデータと等価な文字列で代用しています。
binary format a6a*a hello world ! => hello\000world!
binary format A6A*A hello world ! => hello world!
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} => expected integer but got "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
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 scan binaryData template ?varName varName ...? |
templateは、タイプとカウント数から成ります。
変換した結果は、varNameで指定した変数に入れられます。
binary scanコマンドは、生成した変数の数を返します。
templateに指定するタイプには以下のものがあります。
binary scan abcde\000fghi a6a10 var1 var2 => 1 set var1 => abcde\000 set var2 => can't read "var2": no such variable
binary scan "abc efghi \000" A* var1 => 1 set var1 => abc efghi
binary scan \x07\x87\x05 b5b* var1 var2 => 2 set var1 => 01110 set var2 => 1110000110100000
binary scan \x07\x87\x05 B5B* var1 var2 => 2 set var1 => 01110 set var2 => 1000011100000101
binary scan \x07\x86\x05 h3h* var1 var2 => 2 set var1 => 706 set var2 => 50
binary scan \x07\x86\x05 H3H* var1 var2 => 2 set var1 => 078 set var2 => 05
binary scan \x07\x86\x05 c2c* var1 var2 => 2 set var1 => 7 -122 set var2 => 5返ってきた値は、符号付きの整数ですが、以下の式で符号なし整数に変換できます。
expr ( $num + 0x100 ) % 0x100
binary scan \x05\x00\x07\x00\xf0\xff s2s* var1 var2 => 2 set var1 => 5 7 set var2 => -16返ってきた値は、符号付きの整数ですが、以下の式で符号なし整数に変換できます。
expr ( $num + 0x10000 ) % 0x10000
binary scan \x00\x05\x00\x07\xff\xf0 S2S* var1 var2 => 2 set var1 => 5 7 set var2 => -16
binary scan \x05\x00\x00\x00\x07\x00\x00\x00\xf0\xff\xff\xff i2i* var1 var2 => 2 set var1 => 5 7 set var2 => -16返ってきた値は、符号付きの整数ですが、Tclでは符号なし整数として表現できません。
binary \x00\x00\x00\x05\x00\x00\x00\x07\xff\xff\xff\xf0 I2I* var1 var2 => 2 set var1 => 5 7 set var2 => -16
binary scan \x3f\xcc\xcc\xcd f var1 => 1 set var1 => 1.6000000238418579
binary scan \x9a\x99\x99\x99\x99\x99\xf9\x3f d var1 => 1 set var1 => 1.6000000000000001
binary scan \x01\x02\x03\x04 x2H* var1 => 1 set var1 => 0304
binary scan \x01\x02\x03\x04 c2XH* var1 var2 => 2 set var1 => 1 2 set var2 => 020304
binary scan \x01\x02\x03\x04 c2@1H* var1 var2 => 2 set var1 => 1 2 set var2 => 020304
set signShort [binary format s1 0x8000] binary scan $signShort s1 val; # val == 0xFFFF8000もし、符号なしの値を得たいのであれば、以下のようにマスクをしなければなりません。
set val [expr {$val & 0xFFFF}]; # val == 0x8000