如何在 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);
我想将 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);