How do I handle a 4-byte char array as a typical int in ANSI C?
一些背景:
我解析的二进制文件,我需要读4字节无符号整数。
我想确保,不管是什么平台,此解析器被编译,一个“诠释”始终是4个字节长。
我读过有关uint32_t的和朋友,但我仅限于ANSI C.
提前致谢。
How do I handle a 4-byte char array as a typical int in ANSI C?
一些背景:
我解析的二进制文件,我需要读4字节无符号整数。
我想确保,不管是什么平台,此解析器被编译,一个“诠释”始终是4个字节长。
我读过有关uint32_t的和朋友,但我仅限于ANSI C.
提前致谢。
扔在那里的一些预处理命令
#include <limits.h>
#if LONG_BIT == 32
long buffer [BUFFER_SIZE];
#elif WORD_BIT == 32
int buffer [BUFFER_SIZE];
#endif
你也可以在运行时使用sizeof(int)的。
我建议,而不是试图覆盖数据,你可能会更好只是写功能,做这样的事情uint32 GetUInt32LE(unsigned char *dat)
然后可以被实现为return ((uint32)(dat[3]) << 24) | ((uint32)(dat[2]) << 16) | ((uint32)(dat[1]) << 8) | dat[0];
return ((uint32)(dat[3]) << 24) | ((uint32)(dat[2]) << 16) | ((uint32)(dat[1]) << 8) | dat[0];
为最大可移植性(假定一个定义uint32
合适地),或者可以在其中系统稍微更简单地定义int
被称为是32位或更大。 需要注意的是仍然有较小的系统,其中一些嵌入式编译器int
是只有16位,因此需要在各个字节的转换。 对铸造dat[1]
需要在这样的系统中,因为否则移位一个字节值,像0xFF的八个左否则将产生不确定的行为,其最可能的实际的结果将是把它解释为(INT)(为0xFF00),这将是符号-Extended到0xFFFFFF00,重挫结果的两个高位字节。