CStructは、C言語でバイナリデータの構造化されたパックとアンパックを行うためのライブラリです。Pythonのstruct
モジュールに似た機能を提供します。
- 様々なデータ型のサポート(整数、浮動小数点数、文字列、パディング)
- 配列処理のサポート(全てのデータ型で利用可能)
- エンディアン指定のサポート(リトルエンディアン、ビッグエンディアン)
- IEEE754準拠の半精度浮動小数点数(16ビット)のサポート
詳細な使用方法については、HOWTO.mdを参照してください。
フォーマット文字列は、パックまたはアンパックするデータの型と順序を指定します。
<
: リトルエンディアン(デフォルト)>
: ビッグエンディアン
Pythonのstructと異なり、デフォルトはリトルエンディアンで、ネイティブエンディアンは提供しません。
b
: 8ビット符号付き整数(int8_t)B
: 8ビット符号なし整数(uint8_t)h
: 16ビット符号付き整数(int16_t)H
: 16ビット符号なし整数(uint16_t)i
: 32ビット符号付き整数(int32_t)I
: 32ビット符号なし整数(uint32_t)q
: 64ビット符号付き整数(int64_t)Q
: 64ビット符号なし整数(uint64_t)t
: 128ビット符号付き整数(int8_t[16])T
: 128ビット符号なし整数(uint8_t[16])e
: 16ビット半精度浮動小数点数(IEEE754)f
: 32ビット単精度浮動小数点数(float)d
: 64ビット倍精度浮動小数点数(double)s
: 文字列(バイト数を指定可能、例:5s
は5バイトの文字列。バイト数は省略可能で省略時は1バイト。)x
: パディング(バイト数を指定可能、例:4x
は4バイトのパディング。バイト数は省略可能で省略時は1バイト。)
全ての型指定子に対して、数値プレフィックスを使用して繰り返し回数を指定できます。例えば、3b
は3つの8ビット符号付き整数の配列を表します。
パディング指定子x
を使用した場合、該当するバイト数分だけポインタが進められますが、実際にはメモリへの書き込みは行われません。パディング部分のメモリ内容は変更されずにスキップされます。
文字列指定子s
を使用する場合、指定したバイト数分のデータがコピーされます。アンパック時には、バッファの最後にヌル終端文字が追加されます。そのため、ユーザーは指定したバイト数+1のバッファを用意する必要があります。
例えば、10s
と指定した場合、ユーザーは11バイトのバッファを用意し、アンパック時には10バイトのデータがコピーされ、11バイト目にヌル終端文字が追加されます。
CStructはPythonのstruct
モジュールに似た機能を提供しますが、いくつかの違いがあります:
-
デフォルトのエンディアン:
- Python: デフォルトはネイティブエンディアン(
@
) - CStruct: デフォルトはリトルエンディアン(
<
)で、ネイティブエンディアンの指定子はサポートしていません
- Python: デフォルトはネイティブエンディアン(
-
アライメント:
- Python:
@
や=
指定子を使用してアライメントを制御できます - CStruct: アライメント制御はサポートしていません。明示的なパディング(
x
)を使用する必要があります
- Python:
-
structにのみある書式:
?
(Bool) はこのライブラリではサポートしていません。B
(uint8_t)などを使ってください。p
(Pascal String) はこのライブラリではサポートしていません。n
(size_t) はこのライブラリではサポートしていません。N
(ssize_t) はこのライブラリではサポートしていません。P
(void*) はこのライブラリではサポートしていません。c
(char) はこのライブラリではサポートしていません。B
(uint8_t)などを使ってください。l
(long)、L
(unsigned long) はこのライブラリではサポートしていません。h
(int16_t)、H
(uint16_t)などを使ってください。
Apache-2.0ライセンス