gpt4 book ai didi

mmap 大端与小端

转载 作者:行者123 更新时间:2023-12-02 07:55:32 28 4
gpt4 key购买 nike

如果我使用 mmap 来编写 uint32_t,我会遇到大端/小端约定的问题吗?特别是,如果我在 big-endian 机器上写入一些数据 mmap,当我尝试在 little-endian 机器上读取该数据时会遇到问题吗?

最佳答案

如果您正在使用 mmap,您可能会担心速度和效率。您基本上有几个选择。

  1. 使用 htonl、htons、ntohl 和 ntohs 函数包装所有的读写操作。在 Windows 上调用 htonl(主机到网络)命令会将数据从小端转换为大端。在其他架构上,它将是一个 noop。这些转换确实有开销,但根据您的操作,它们可能会或可能不会很重要。据我所知,这是 SQLite 使用的方法
  2. 您的另一个选择是始终以主机格式写入数据,并在用户需要跨平台迁移数据时提供例程。数据库通常以主机格式读取和写入数据,但提供像 bcp 这样的工具可以写入 ASCII 或网络字节顺序。
  3. 您可以使用字节顺序标记来标记文件的标题。当你的程序启动时,它会将它的字节顺序与文件的字节顺序进行比较,并在需要时提供任何翻译。这通常适用于像 UTF-16 这样的简单数据格式,但不适用于具有多种可变长度类型的格式。

此外,如果您执行诸如提供长度前缀或文件偏移量之类的操作,您可能会混合使用 32 位和 64 位指针。 32 位平台无法创建大于 4GB 的 mmap View ,因此您不太可能支持大于 4GB 的文件大小。 rrdtool 等程序采用这种方法,并在 64 位平台上支持更大的文件大小。这意味着如果您在文件中使用平台指针大小,您的二进制文件将无法跨平台兼容。

我的建议是预先忽略所有字节顺序问题,并将系统设计为在您的平台上快速运行。如果/当您需要将数据移动到另一个平台时,请选择最简单/最快捷/最合适的方法。如果您一开始就尝试创建一种平台无关的数据格式,那么您通常会犯错误,并且稍后必须返回并修复这些错误。当 99% 的数据字节顺序正确而 1% 错误时,这尤其成问题。这意味着修复数据转换代码中的错误将破坏所有平台上的现有客户端。

在编写支持多个平台的代码之前,您需要进行多平台测试设置。

关于mmap 大端与小端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1025783/

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