gpt4 book ai didi

c - 如何 fwrite 和 fread endianness independent integers,这样我就可以在许多机器上 fwrite 和 fread 并且总是有相同的结果

转载 作者:太空狗 更新时间:2023-10-29 15:37:43 34 4
gpt4 key购买 nike

fwrite 一个整数取决于字节序,但是有没有一种方法可以将一个整数 0x00000004 写入一个文件,这样无论它运行在什么机器上,它都可以始终被读取为 0x00000004。

  • 一个想法是始终按照特定顺序写入第一位,然后是第二位,然后是第三位,例如使用模数或位移来获取每个十进制值。

  • 不确定是否有一种方法可以强制 fwrite 写入小端,而无需进行一些复杂的检查以查看当前系统是否为大端,然后在 fwrite 之前反转位。

  • 另一个想法是将它作为 ascii 存储在文件中,这没什么大不了的,它只是将 4 个字节变成了 8 个(十六进制)。但我认为这只是一个懒惰的解决方案。

我想从可能不同的机器上进行 fwrite 和 fread,所以这两个操作都需要能够 fwrite 和 fread 相同的字节顺序,而且我不确定(在搜索这个站点之后)以一种可移植的方式来做到这一点(没有使用一些晦涩的库,这些库可能在某些机器上也可能不在)。

最佳答案

我认为您无需担心位级字节顺序,我认为它们始终相同 how is data stored at bit level according to "Endianness"?

我可能会使用固定字节序来存储数据,并为 fread 和 fwrite 制作一些包装函数。

所以假设您决定以小端存储所有内容,包装器将检查机器字节序并:

  • 如果机器是小端,直接使用fread和fwrite。
  • 如果机器是大端,相应地交换字节。显然,您会假设只有 int 对齐的读/写(如果您混合使用不同的长度类型,您的包装器将无法知道要交换哪些字节)。

编辑 例如,您的 fwrite 可能看起来像这样(虽然没有测试,只是为了说明这个想法)。来自 C program to check little vs. big endian 的字节序检查:

size_t lendian_fwrite(const void *ptr, size_t size, size_t nmemb,
FILE *stream)
{
if (size != 4)
{
/* Warn and exit */
}

int x = 1;

if ( *((char*)&x) == 1)
{
/* Little endian machine, use fwrite directly */
return fwrite(ptr, size, nmemb, stream);
}
else
{
/* Big endian machine, pre-process first */

unsigned char *buffer = (unsigned char*) ptr;

for (int i=0; i<nmemb; i++)
{
unsigned char a = buffer[4*i];
unsigned char b = buffer[4*i + 1];

buffer[4*i] = buffer[4*i + 3];
buffer[4*i + 1] = buffer[4*i + 2];
buffer[4*i + 2] = b;
buffer[4*i + 3] = a;
}

return fwrite(ptr, size, nmemb, stream);
}
}

关于c - 如何 fwrite 和 fread endianness independent integers,这样我就可以在许多机器上 fwrite 和 fread 并且总是有相同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40193322/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com