まず第一に、これはプラットフォームに依存するため、パフォーマンスの最適化 (キャッシュ ラインのアライメント、整数のアライメントなど) のためにコンパイラが構造体のどこにパディング バイトを挿入するかを事前に知ることはできません。もちろん、自分のプラットフォームでのみアプリを構築することを検討している場合は除きます。
とにかく、あなたの場合、どこか(ネットワーク?)からデータを取得しているように見え、データが圧縮されている可能性が非常に高いです(フィールド間にパディングバイトはありません)。
配列を構造体ポインターに本当に型キャストしたい場合でも、追加される可能性のあるパディング バイトを削除するようコンパイラーに指示できます。これは、使用するコンパイラに依存し、標準の C 実装ではないことに注意してください。gcc では、構造定義の最後に次のステートメントを追加できます。
struct my_struct {
int blah;
/* Blah ... */
} __attribute__((packed));
メンバーアクセス、コピーなどのパフォーマンスに影響しますのでご注意ください...
よほどの理由がない限り、絶対に使用しないでください__attribute__((packed))
。
もう 1 つの解決策は、自分で解析を行うことです。適切な構造体を割り当て、バッファから適切な情報を探してそのフィールドに入力するだけです。ここでは、一連のmemcpy
指示でうまくいく可能性があります (Kerrek の回答を参照)。