1

標準の C だけを使用して、外部ライブラリを使用せずに bmp ファイルの読み取り、編集、および書き込みを行いたいと考えています。

私の理解が正しければ、バイトが bmp ファイル形式に一致するように適切に配置されていることが重要です。

ただし、インターネット上のどこかで、コンパイラが余分なバイトを埋め込むことが許可されていることも読んだことがあると思います。structそのため、構造体が占有するバイト数や、メンバーが構造体内でどのように配置されているかを常に正確に確認できるとは限りません。

標準 C だけを使用してこの問題を解決するにはどうすればよいですか? 構造体が指定したとおりに見えることをコンパイラに確認するための構文はありますか?

4

2 に答える 2

1

Knnnug がコメントで述べているように、BMP 形式は C 構造体型と互換性を持つように設計されています。ACコンパイラは、任意の2つの構造体メンバーの間または最後のメンバーの後に、好きな理由で好きなだけパディングを自由に挿入できますが、実際には、コンパイラはアライメントに必要な場所にのみパディングを挿入します。プラットフォーム用に書かれた ABI に。

offsetofマクロとsizeof演算子を使用してをテストできますが、構造体型のレイアウトを指定することはできません。目的にはおそらく十分です。

たとえば、32 ビットの符号なし整数、16 ビットの符号なし整数、および 2 つの 8 ビットの符号なし整数で構成される外部から課されたレイアウトに準拠する構造体が必要な場合は、この順序で合計 64 ビットが割り当てられます。次のように書くことができます:

#include <stdint.h>
#include <stddef.h>
#include <assert.h>

struct s {
    uint32_t a;
    uint16_t b;
    uint8_t c;
    uint8_t d;
};

void test_layout(void) {
    assert(offsetof(struct s, a) == 0);
    assert(offsetof(struct s, b) == 4);
    assert(offsetof(struct s, c) == 6);
    assert(offsetof(struct s, d) == 7);
    assert(sizeof (struct s) == 8);
}

test_layout()プログラムの開始時に関数を呼び出します。プログラムがそれを生き延びれば、レイアウトが正しいと確信できます。

まあ、ほぼ -- バイト順のテストは演習として残されています。

于 2013-06-29T23:37:53.190 に答える