2
How do I handle a 4-byte char array as a typical int in ANSI C?

いくつかのコンテキスト:

4バイトの符号なし整数を読み取る必要があるバイナリファイルを解析しています。

このパーサーがどのプラットフォームでコンパイルされていても、「int」の長さは常に4バイトであることを確認したいと思います。

uint32_tとその友達について読んだことがありますが、ANSICに限定されています。

前もって感謝します。

4

2 に答える 2

2

そこにいくつかのプリプロセッサコマンドを投げます

#include <limits.h>

#if LONG_BIT == 32
    long buffer [BUFFER_SIZE];
#elif WORD_BIT == 32
    int buffer [BUFFER_SIZE];
#endif

実行時にsizeof(int)を使用することもできます。

于 2012-07-24T13:05:28.690 に答える
0

データをオーバーレイしようとするよりも、次のようなことを行うための関数を作成する方がよい場合があります。これは、最大の移植性uint32 GetUInt32LE(unsigned char *dat)として実装できます(適切に定義されていると仮定します)。または、システムでもう少し簡単に定義できます。ここで、aは32ビット以上であることがわかっていました。16ビットしかない小規模なシステム用の組み込みコンパイラがまだいくつかあるため、個々のバイトにキャストする必要があることに注意してください。キャストreturn ((uint32)(dat[3]) << 24) | ((uint32)(dat[2]) << 16) | ((uint32)(dat[1]) << 8) | dat[0];uint32intintdat[1]0xFFのようなバイト値を8だけ左にシフトすると、未定義の動作が発生し、実際の結果は(int)(0xFF00)として解釈され、0xFFFFFF00に符号拡張されて、結果の上位2バイト。

于 2012-09-14T16:05:38.700 に答える