Linux は、 types.hでリトルエンディアンの 32 ビット型を識別します。ディスク上のデータ構造を C 構造体として作成する必要がありますが、属性の 1 つが 24 ビットです。同じ行でどのように表すのですか?
Linux には __le32 と __le64 がありますが、それ以外のサイズのものはありません。
Linux は、 types.hでリトルエンディアンの 32 ビット型を識別します。ディスク上のデータ構造を C 構造体として作成する必要がありますが、属性の 1 つが 24 ビットです。同じ行でどのように表すのですか?
Linux には __le32 と __le64 がありますが、それ以外のサイズのものはありません。
最も近い大きな型、つまり を使用し__le32
てから、バイトを個別に書き出します。コンパイラはパディングを追加できる (そして追加する) ため、構造体全体を一度に書き込むべきではありません。これは、コンパイラとアーキテクチャによって異なります。出力ファイル内の各バイトの正確な使用状況を把握できるように、各フィールドは 1 つの単位としてファイルに書き込まれる必要があります。
1 つのアプローチは、2 つの異なるタイプを使用することです。1 つはメモリ内の表現と操作用で、もう 1 つはディスク上のフォーマット用です。インメモリ バージョンでは、便利な単純な型が使用されます (符号なし 24 ビット値の uint32_t など)。ディスク上の表現では、uint8_t 型の配列を使用できます。もちろん、これには変換ルーチンが必要です (該当する場合は、リトル エンディアンとビッグ エンディアンの間の変換も分離します)。
以下は、説明のためにいくらか不自然な例です。
typedef struct {
uint8_t version[3];
uint8_t options[2];
uint8_t data[3];
} my_type_disk;
typedef struct { /* size of fields may diffe from disk version */
uint32_t version; /* order may be different too */
uint32_t data;
uint16_t options;
} my_type_host;
void myTypeDiskToHost (my_type_disk *, my_type_host *);
void myTypeHostToDisk (my_type_host *, my_type_disk *);
お役に立てれば。