0

Linux は、 types.hでリトルエンディアンの 32 ビット型を識別します。ディスク上のデータ構造を C 構造体として作成する必要がありますが、属性の 1 つが 24 ビットです。同じ行でどのように表すのですか?

Linux には __le32 と __le64 がありますが、それ以外のサイズのものはありません。

4

2 に答える 2

2

最も近い大きな型、つまり を使用し__le32てから、バイトを個別に書き出します。コンパイラはパディングを追加できる (そして追加する) ため、構造体全体を一度に書き込むべきではありません。これは、コンパイラとアーキテクチャによって異なります。出力ファイル内の各バイトの正確な使用状況を把握できるように、各フィールドは 1 つの単位としてファイルに書き込まれる必要があります。

于 2013-08-23T11:29:42.527 に答える
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 *);

お役に立てれば。

于 2013-08-23T12:23:04.517 に答える