检测字节顺序

2024-03-26

我目前正在尝试创建一个C无论目标系统的字节顺序如何,源代码都能正确处理 I/O。

我选择了“little endian”作为我的 I/O 约定,这意味着,对于 big endian CPU,我需要在写入或读取时转换数据。

转换不是问题。我面临的问题是检测字节序,最好是在编译时检测(因为CPU不会在执行过程中改变字节序......)。

到目前为止,我一直在使用这个:

#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
...
#else
...
#endif

它被记录为 GCC 预定义宏,Visual 似乎也能理解它。

但是,我收到报告称某些 big_endian 系统 (PowerPC) 检查失败。

因此,我正在寻找一种万无一失的解决方案,以确保正确检测到字节序,无论编译器和目标系统如何。好吧,他们中的大多数至少...

[编辑]:大多数提出的解决方案都依赖于“运行时测试”。这些测试有时可能会在编译期间由编译器正确评估,因此不会影响实际的运行时性能。

然而,用某种 if (0) { ... } else { ... }>> 还不够。在当前代码实现中,变量和函数宣言取决于 big_endian 检测。这些不能用 if 语句更改。

嗯,显然,有一个后备计划,那就是重写代码......

我宁愿避免这种情况,但是,好吧,这看起来希望越来越渺茫......

[编辑2]:我通过深入修改代码测试了“运行时测试”。尽管它们正确地完成了自己的工作,但这些测试也会影响性能。

我期望,由于测试具有可预测的输出,编译器可以消除错误的分支。但不幸的是,它并不总是有效。 MSVC 是很好的编译器,并且成功地消除了错误分支,但 GCC 的结果好坏参半,具体取决于版本、测试类型,并且对 64 位的影响比对 32 位的影响更大。

真奇怪。这也意味着无法确保编译器能够处理运行时测试。

Edit 3:这些天,我使用编译时常量联合,期望编译器将其解决为明确的是/否信号。 而且效果很好:https://godbolt.org/g/DAafKo https://godbolt.org/g/DAafKo


如前所述,检测 Big Endian 的唯一“真正”方法是使用运行时测试。

然而,有时,宏可能是首选。

不幸的是,我没有找到一个单独的“测试”来检测这种情况,而是找到了它们的集合。

例如,GCC 建议:__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__。但是,这仅适用于最新版本,早期版本(和其他编译器)将为该测试提供一个假值“true”,因为 NULL == NULL。所以你需要更完整的版本:defined(__BYTE_ORDER__)&&(__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)

好的,现在这适用于最新的 GCC,但是其他编译器呢?

你可以尝试__BIG_ENDIAN__ or __BIG_ENDIAN or _BIG_ENDIAN它们通常在大端编译器上定义。

这将改善检测。但如果您专门针对 PowerPC 平台,则可以添加更多测试来改进更多检测。尝试_ARCH_PPC or __PPC__ or __PPC or PPC or __powerpc__ or __powerpc甚至powerpc。将所有这些定义绑定在一起,您就有相当大的机会检测大端系统,特别是 powerpc,无论编译器及其版本如何。

因此,总而言之,不存在“标准预定义宏”这样的东西可以保证在所有平台和编译器上检测大端 CPU,但是有许多这样的预定义宏,它们共同给出了很高的概率在大多数情况下正确检测大端字节序。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

检测字节顺序 的相关文章

随机推荐

  • 如何像 Stack Overflow 一样在网页上显示具有良好语法样式的代码示例?

    我希望能够从数据库中提取一些代码示例和 或将文本嵌入到网站中 然后将示例以类似时尚的代码格式显示在屏幕上 虽然屏幕上的文字很棒 但格式将使其更加用户友好 这是怎么做到的 我要这个 public string MyString 示例文本 To
  • 如何在 docker 容器中生成与主机用户具有相同所有者的文件

    我使用 docker 容器在 git 存储库中完成一些开发任务 我使用的容器是专门为每个项目构建的 这样每个贡献者只需要 docker CLI 即可完成工作 不好的一面是容器以 root 身份运行 因此一旦容器停止 生成的文件就归 root
  • 需要数组,但在 Jest 中收到数组

    我在 Jest 中创建了单元 异步 测试 但是当我收到服务器的响应时 name My name name Another name 并测试它 test Response from server gt get my url end error
  • 从 Subversion 推送到 Web 服务器

    很久以前 我试图在本地 网络服务器和颠覆之间整理我的系统 我得到了一些很好的解释这个问题 https stackoverflow com questions 248769 php ide want to sync local storage
  • 在 OpenErp 中创建功能字段

    如何在 OpenERP 中创建功能字段 看来我需要在 python 中创建函数 然后用 XML 调用它 我看到需要编辑的 XML 但是 python 代码放在哪个文件中 py文件的代码 class some model osv osv na
  • 如何使用自动查询返回多对多关系的嵌套对象

    假设我有 3 个课程 public class Book Autoincrement public int Id get set public string Title get set Reference public list
  • PHP第一次将字符串写入新行而不是文件末尾

    使用Codeigniter函数write file 我可以像这样写入现有文件 write file path to file String four n a 假设我已经有一个这样的文件 String one String two Strin
  • Lua中如何去除字符串中的空格?

    我想从 Lua 中的字符串中删除所有空格 这是我尝试过的 string gsub str string gsub str string gsub str s 这似乎不起作用 如何删除所有空格 它有效 您只需分配实际结果 返回值 使用以下变体
  • 使用 Perl 的 SOAP::Lite 和 WSDL 文件进行 SOAP 调用

    我想对本地 Web 服务进行 SOAP 调用 Web 服务是通过 WSDL 文件定义的 见下文 我想使用 Perl 和 SOAP Lite 我试过这个 use strict use warnings use SOAP Lite my end
  • Xcode 异常断点不会打印抛出异常的详细信息

    SUMMARY 当我设置异常断点时 我没有收到异常消息 如何获取异常消息 我已经知道如何获取堆栈跟踪 但不包括异常消息 DETAILS 过去我使用 Xcode 开发 iOS 应用程序 当出现问题时 我会收到错误 异常 该异常通常会出现 无法
  • 如何在 Gattle 中注入恒定数量的用户?

    我不清楚如何控制加特林中的封闭工作负载模型 如果我使用constantConcurrentUsers 像这样 myScenario inject constantConcurrentUsers 40 during 2 minutes 我认为
  • Rails 资产最佳实践 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我是 Rails 新手 无法找出组织
  • 迅捷继承:超级的超级

    假设这三个类具有简单的层次结构 class A func foo print A class B A override func foo super foo print B class C B override func foo print
  • 使用迭代器初始化字符串,出现“转置指针范围”异常

    也许是一个菜鸟问题 但为什么是这两行 vector
  • 将方法列表中的方法应用于 pandas 数据框

    这是我的第一个问题 所以请耐心等待 我的问题如下 假设我们有一个 pandas Dataframe 并且我们希望动态地将一些 pd Series 方法应用于该 Dataframe 的一组列 为什么下面的例子不起作用 testframe pd
  • Jenkinsfile 中的 Anaconda

    由于我们运行的测试越来越长 我认为从 Travis CI 切换到 Jenkins 在我的本地计算机上 是个好主意 设置 Jenkins 相对简单 但让我的 Jenkinsfile 工作 却不是那么简单 我正在尝试下载 miniconda g
  • 基于存储过程参数的条件 where 子句?

    我有一个带有参数的 SQL Server 2005 存储过程 includeClosedProjects 有一个WHERE我想根据这个参数控制的子句 create proc sel projects incClosedRel int 1 a
  • Sublime Text 2 Javascript 控制台

    我是 Sublime Text2 和 Javascript 新手 使用 Windows 8 我正在尝试在 Sublime Text 中创建一个 Javascript 控制台 我尝试了两种方法 但没有一个对我有用 方法一 我已经安装了在这里找
  • 如何在 android 中从 Http 或 RTSP Url 流式传输视频

    我想在 android 上播放 Http 和 Rtsp 的视频 目前我正在尝试使用 http 链接 但是当我的活动开始时 它只是开始播放带有空白黑屏的音频 没有视频显示 我在下面发布了我的代码 感谢您提前提供的任何帮助 如果有人可以提供一个
  • 检测字节顺序

    我目前正在尝试创建一个C无论目标系统的字节顺序如何 源代码都能正确处理 I O 我选择了 little endian 作为我的 I O 约定 这意味着 对于 big endian CPU 我需要在写入或读取时转换数据 转换不是问题 我面临的