3

こんなことがしたい---

byte[] byte2 = new byte[19];

tcl で同じことを行うにはどうすればよいですか?

4

2 に答える 2

6

Tclは、バイトの配列を、U+0000からU+00FFまでの文字のみを含む文字列であるかのように(つまり、ISO 8859-1文字であるかのように)処理します。実装にはいくつかの詳細があります(完全なUnicode文字列や恐ろしい疑似UTF-8バイトシーケンスとしてではなく、Tclの内部をバイト配列として転送されます)が、それらを文字列として扱うだけです。

19バイトの長さのNULバイトの文字列を作成するには、次のようにします。

set byte2 [string repeat "\u0000" 19]

binary次に、コマンドを使用して操作できます(またはencoding convertfrom、他のエンコーディングの文字列として再解釈できます)。それがバイトなのか文字なのか、それともスクリプト内の何かなのかを気にする必要はありません。特に、Tclには文字列をうまく処理するコマンドがたくさんあり、それらはバイト配列でも同様に機能します。

それが本当にバイトの配列であるかどうかが本当に重要になる唯一のポイントは、CAPIで作業しているときです。その時点でTcl_GetByteArrayFromObj、実際のバイト配列(C)を取得するために使用するバイト配列を読み取る必要がある場合は、そのバイト配列をunsigned char作成しなかった場合、またはより技術的には、の参照カウントTcl_Objが1より大きい(つまり、Tcl_IsShared真の値を返す場合。真の値を返す場合は、で複製しTcl_DuplicateObjて変更できるものを取得しますが、正しく格納または割り当て解除されるようにする必要があります)。

于 2012-08-14T08:00:38.433 に答える
5

ドナルが書いたことをさらに明確にしたい。

Tcl では、文字列とほとんど同じようにバイト配列を操作するという点を強調する必要があります。つまり、コード

byte[] byte2 = new byte[19];

OPがそのbyte2Cスタイルの配列の要素にランダムにアクセスし、それらを新しい値に置き換えるなどのヒント.

対照的に、Tcl でのそのような動作は異なります。インデックス付きのほぼ C スタイルの配列が必要な場合は、代わりに s を使用し、データをワイヤにシリアル化しようとしているときにlistのみ、結果のリストを (コマンドを使用して) 実際のバイト文字列に変換する必要があります。binary formatフォーマット(またはファイルなどに書き込む)。値を 1 つずつ追加することによって、結果のバイト配列がインクリメンタルに形成される場合は、別のアプローチが便利です。この場合、単純に and を使用する必要がbinary formatありappendます。

バイナリエンコーディングを扱うtcllibのモジュールのいくつかを調べるように OP に勧めます(base64明らかな候補の 1 つです)。

于 2012-08-14T08:24:42.983 に答える