#include <stdint.h>
union header {
uint8_t a[8];
uint64_t u;
};
const struct header h = { .u = (sizeof( short ) << 0 )
| (sizeof( int ) << 8 )
| (sizeof( long ) << 16 )
| (sizeof( long long ) << 24 )
| (sizeof( float ) << 32 )
| (sizeof( double ) << 40 )
| (sizeof( long double ) << 48 )
| 0 } ;
これは、浮動小数点数が非常に難しいことを除いて、型のサイズとエンディアンを検証するのに十分なはずです。
浮動小数点数がライターとリーダーで同じ形式で格納されていることを確認する場合は、2つの定数浮動小数点数(0、1、および-1よりも興味深い)を異なる形式で格納することをお勧めします。このヘッダーの後にサイズを設定し、それらが本来あるべきものであることを確認します。
バージョン番号とともに実際のマジックストリングを保存することも、これが正しいファイル形式であることを確認するための別のチェックとして役立つ可能性が非常に高くなります。
フロートなどを気にしない場合は、自由に削除してください。常に1バイトであると想定されているため、charは含めませんでした。
次のような構造体のsizeも保存することをお勧めします。
struct misalligned {
char c;
uint64_t u;
};
これにより、ファイルを生成したコードを生成したコンパイラーの配置とパディングを簡単に判別できるようになります。これがアライメントを気にするほとんどの32ビットコンピュータで行われた場合、cとuの間に3バイトのパディングがあるため、サイズは96になりますが、64ビットマシンで行われた場合、サイズは128になり、次のようになります。 cとuの間の7バイトのパディング。これがAVRで行われた場合、パディングがないため、これのサイズはおそらく9になります。
ノート
- この回答は、ファイルがメモリマップされており、ファイルの形式が間違っていることを認識する以外に移植性は必要ないという質問に依存していました。質問が一般的なファイルの保存と検索に関するものだったとしたら、私は違った答えをしたでしょう。最大の違いは、データ構造のパッキングです。