如何在 C 中以大端顺序将 int32_t 的 4 个字节写入二进制文件?

How do I write the 4 bytes of an int32_t to a binary file in big-endian order in C?

我想将 int32_t 的 4 个字节以大端顺序写入二进制文件。我直接使用 fwrite() 和指向我的 int32_t 的指针,它有点工作,但问题是我的整数是按小端顺序写入的,首先写入最小的字节。例如,如果我写:

int32_t specialInt = 262;
fwrite(&specialInt, 4, 1, myFile);

然后我用我的十六进制编辑器打开它,我看到:

06 01 00 00 ...

这与我想要的相比倒退了。我想:

00 00 01 06 ...

我应该如何让我的 int_32t 处于大端顺序?是否有一个内置的 C 库函数可以按正确的顺序获取字节,或者我应该使用 memcpy() 将字节放入临时字符数组,然后将字节一个一个地写入文件?

感谢 pmg 在评论中写下答案:

假设CHAR_BIT == 8

unsigned char value[4];
value[0] = (uint32_t)specialInt >> 24;
value[1] = (uint32_t)specialInt >> 16;
value[2] = (uint32_t)specialInt >> 8;
value[3] = (uint32_t)specialInt;
fwrite(value, 4, 1, myFile);

您可以使用 arpa/inet.h header 中 POSIX 2001 标准中的 htonl() 函数。参见 https://linux.die.net/man/3/ntohl

Big endian是互联网字节序,称为“网络字节序”。

您需要将 int32_t 转换为 uint32_t。此转换由 C 标准定义。接下来通过 htonl() 将其转换为网络字节序,然后将其写入文件:

int32_t specialInt = 262;
uint32_t encodedInt = htonl((uint32_t) specialInt);
_Static_assert(sizeof encodedInt == 4, "Oops");
fwrite(&encodedInt, 4, 1, myFile);

它可以用复合文字缩写。

fwrite(&(uint32_t) { htonl((uint32_t)specialInt) }, 4, 1, myFile);