質問する前に: 私は実際のハードウェアを扱っています。
エンディアンに関して、フィールドのビット長が異なる (1、3、24、または 48 ビットなどのフィールドを含む) データ構造の内容を指定できるメタ言語を探しており、アクセスする C++ コードを生成します。データ。
質問があいまいすぎるために保留になったので、できるだけ明確にしようとします。
次の言語を探しています。
- 単純な構造記述を受け入れ、有用な C++ コードを生成します。
- データ(通常は文字列)とともに、1ビットから複数(最大8)バイトまでの範囲の整数を正確に指定できます。
- エンディアンを変換する必要がなくなり、
- オーバーヘッドを伴わない正確で予測可能な出力を生成します (プロトコル バッファのように)
ASN.1 は目的にはほぼ適しているように聞こえますが、独自のオーバーヘッドが追加されます (つまり、2 バイトが 4 つのニブルに分割された単純な構造を作成することはできません)。私が探しているのは、構造。
たとえば、これを抽象化したいと思います。
struct Command {
struct Record {
int8_t track;
int8_t point;
int8_t index;
int16_t start_position; // big endian, misaligned
int32_t length; // big endian, misaligned;
} __attribute__((packed)); // structure length = 11 bytes.
int8_t current : 1;
int8_t command : 7;
int8_t reserved;
int16_t side : 3; // entire int16_t needs to be
int16_t layer : 3; // converted from big endian, because
int16_t laser_mark : 3; // this field spans across bytes.
int16_t laser_power : 3;
int16_t reserved_pad : 2;
int16_t laser_tag : 2;
int32_t mode_number : 8; // again, entire 32 bit field needs to be converted
int32_t record_count : 24; // from big endian to read this count properly.
Record records[];
} __attribute__((packed));
上記は、バイトを運ぶ構造体に正確にパックする必要があり8 + record_count * 11
、すべて正確に形成され、追加のデータや追加のビットまたはバイトセットはありません。
上記は一例です。しばしば何百ものフィールドを持つ実際の構造でサイトを詰まらせないように、シンプルに作られています。単純化されていますが、私が楽しみにしている機能の多くを示しています (残りの 2 つの機能は、48 ビットまたは 64 ビットの整数とプレーン データ (bytes[])) です。
この質問がまだ曖昧すぎる場合は、コメントに追加する必要があることを説明してください。ありがとう!