基本的なデータ型_ビット値 - hsk/swfspec_ja GitHub Wiki
ビット値
ビット値は可変長のビットフィールドで、3 種類の型があります。
符号無し整数 符号付き整数 符号付き 16.16 固定小数点数 ビット型はバイト境界に沿う必要はありません。他の型 (UI8 とか UI16) は常にバイト境界に合わせる必要があります。ビット型の次にバイト境界に合わせる型が出てくるときは、ビット型の最後のバイトの残りが 0 埋めされます。
次に表す例は 64 bit のストリームで、64 bit 中に 9 つの異なるビット長の値があり、次に UI16 型の値が続きます。
Byte1---Byte2---Byte3---Byte4---Byte5---Byte6---Byte7---Byte8---
0101100101001001001011110010001101011100110010000100110010101101
BV1---BV2--BV3---BV4-BV5-----BV6BV7--BV8BV9-pad-UI16------------

このビットストリームは、まず 6 bit の値 (BV1) から始まり、5 bit の値 (BV2) が続きます。 BV2 は Byte1 と Byte2 をまたがります。BV3 は Byte2 と Byte3 をまたぎ、BV4 は Byte3 の中に収まります。 Byte5 の中には BV7 と BV8 が含まれ、 BV9 の後には、バイト境界に整列されるタイプの型 (UI16) が続きます。Byte6 の 最後の 4 bit は、ゼロ埋めされます。
ビット型
| 型 | コメント |
|---|---|
| SB[nBits] | 符号付きビット値 (nBits は、値の保存に使われるビット長を表す) |
| UB[nBits] | 符号無しビット値 (nBits は、値の保存に使われるビット長を表す) |
| FB[nBits] | 符号付き固定小数点数 (nBits は、値の保存に使われるビット長を表す) |
符号無しビット型の値が現在より大きいサイズの入れ物に拡張される時、左端のビットはゼロ埋めされます。 符号付きビット型の値が現在より大きいサイズの入れ物に拡張される時、左端のビットの値で残りがコピーされます。
この拡張の仕方は、"符号拡張" と呼ばれています。 例を挙げると、4 bit の符号無し値 UB[4] = 1110 を 16 bit サイズに拡張する時、値は 0000 0000 0000 1110 = 14 という風になります。符号付き値の場合は、 SB[4] = 1110 が、 1111 1111 1111 1110 = -2 というように解釈されます。
符号付きビット型は必ず、最上位ビットに符号を付ける必要があります。 例えば、符号付き値 35 は、 SB[7] = 0100011 と表現されます。最上位ビットにゼロを必ず必要とします。 最上位ビットがゼロで無い場合、値は負の数として解釈されます。
固定小数点ビット型は、32 bit の 16.16 符号付きの固定小数点数で、上位 16 bit は整数、下位 16 bit は小数を表します。固定小数点ビット型は符号付きビット型の値と見た目は同じであっても、解釈の仕方が異なります。 例えば、 19 bit 符号付きビット型の 0x30000 は、10 進数で 196608 として扱われ、 19 bit 固定小数点ビット型の 0x30000 は 3.0 として扱われます。このフォーマットの値は 16.16 ではなく、 3.16 として解釈されます。
ビット型の使用方法
ビット型は、可能な限り少ないビット数で値を保存します。ほとんどの場合、固定サイズのビット数を使います。 いくつかのパターンで可変長のビット数を使いますが、その場合、同じ構造体のメンバの中でどれくらいのサイズを使用するのか指定するフィールドがあります。これら可変長の場合では、アプリケーションが SWF ファイルを生成する過程で、値の保存に必要な最小のビット数を決定します。 符号付きのビット型では、正の数を表すために最上位ビットに 0 を付加する必要があります。1 の場合は、値が負の数として扱われます。
ここでは例として RECT 構造体で考えてみましょう。
RECT
| フィールド | 型 | コメント |
|---|---|---|
| Nbits | UB[5] | 矩形のそれぞれのフィールドで使われるビット数 |
| Xmin | SB[Nbits] | 矩形の最小 X 座標 |
| Xmax | SB[Nbits] | 矩形の最大 X 座標 |
| Ymin | SB[Nbits] | 矩形の最小 Y 座標 |
| Ymax | SB[Nbits] | 矩形の最大 Y 座標 |
Nbits フィールドの値で、Xmin, Xmax, Ymin, Ymax のそれぞれのビット長を指定します。 次のようなデータが RECT 構造体に入っているとすると、
Xmin = 127 (10進数) = 1111111 (2進数)
Xmax = 260 (10進数) = 100000100 (2進数)
Ymin = 15 (10進数) = 1111 (2進数)
Ymax = 514 (10進数) = 1000000010 (2進数)
Nbits の値は一番多くのビットを必要とするフィールドから求めることができます。 上の表では、514 (01000000010) が、11 ビットの長さで、最大のものとなります。
結果、次に示すような形式で保存されます。
RECT
| フィールド | 型と値 | コメント |
|---|---|---|
| Nbits | UB[5] = 01011 | 必要なビット数 (11) |
| Xmin | SB[11] = 00001111111 | twip 単位の最小 X 座標 (127) |
| Xmax | SB[11] = 00100000100 | twip 単位の最大 X 座標 (260) |
| Ymin | SB[11] = 00000001111 | twip 単位の最小 Y 座標 (15) |
| Ymax | SB[11] = 01000000010 | twip 単位の最大 Y 座標 (514) |
移動
- 前のページ : エンコードされた整数
- 次のページ : 文字列の値