【问题标题】:Writing bytes to file gets swapped on certain platforms将字节写入文件在某些​​平台上被交换
【发布时间】:2023-05-12 11:16:01
【问题描述】:

下面的代码在不同的系统上给了我不同的输出:

int fd = open(filename, O_RDWR | O_CREAT, S_IRWXU | S_IRWXG | S_IRWXO);
byte_t data[] = { 0x00, 0x01, 0x02, 0x03, 0x0a, 0x0b 0x0c, 0x0d };

write(fd, data, sizeof(data));

在 mac 上,文件名的“hexdump”给出了我的预期

00 01 02 03 0a 0b 0c 0d

在 Ubuntu 和 Windows 上(代码不同但效果相同)你会得到

01 00 03 02 0b 0a 0d 0c

我想要打印平台

00 01 02 03 0a 0b 0c 0d

那我应该怎么做呢?

【问题讨论】:

  • “byte_t”是跨两个平台的一致数据类型吗?
  • “代码不同”?请向我们展示实际代码,而不是一些近似值。
  • 我认为您显示的代码不太可能按照您在 any 平台上描述的方式运行(无论字节顺序如何)。请附上 SSCCE (sscce.org)。
  • 看起来像 ENDIANNESS 问题。虽然不是很典型。看看这些IMB write endian independent codesome random doc I found on google
  • 感谢你们的帮助,我最终学到了更多关于可能的字节顺序问题的知识。

标签: c io posix fwrite


【解决方案1】:

看起来 hexdump 实用程序交换了字节。请显示您在每个平台中使用的 hexdump 命令。

要确认,请测试

byte_t data[] = { 'a', 'b', 'c', 'd', 'e' }

并比较 hexdump 和 cat(或类型)输出。

【讨论】:

  • 我用 xxd 测试了我的输出,数据以正确的顺序打印出来。 Hexdump 仍然显示字节反转。我认为您是对的,这只是 hexdump 在某些平台上的行为方式,而不是通过交换字节写入的数据。
  • 你对hexdump使用了哪些选项?
  • 我没有使用任何选项(也许我应该有)。文件名为 mywave.wav,所以我写了:hexdump mywave.wav
  • @user 是的。 Linux 中的“-C”。
最近更新 更多