Skip to content

sensignal/cstruct

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

12 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

CStruct

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バイト目にヌル終端文字が追加されます。

Pythonのstruct.packとの差異

CStructはPythonのstructモジュールに似た機能を提供しますが、いくつかの違いがあります:

  1. デフォルトのエンディアン

    • Python: デフォルトはネイティブエンディアン(@
    • CStruct: デフォルトはリトルエンディアン(<)で、ネイティブエンディアンの指定子はサポートしていません
  2. アライメント

    • Python: @=指定子を使用してアライメントを制御できます
    • CStruct: アライメント制御はサポートしていません。明示的なパディング(x)を使用する必要があります
  3. 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ライセンス

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Packages

No packages published