0

質問する前に: 私は実際のハードウェアを扱っています。

エンディアンに関して、フィールドのビット長が異なる (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[])) です。

この質問がまだ曖昧すぎる場合は、コメントに追加する必要があることを説明してください。ありがとう!

4

1 に答える 1