【问题标题】:When to worry about endianness?什么时候担心字节顺序?
【发布时间】:2011-01-13 21:09:17
【问题描述】:

我看过无数关于字节序及其含义的参考资料。我对此没有任何问题... 然而,我的编码项目是一个简单的游戏,可以在标准的“游戏玩家”硬件上运行在 linux 和 windows 上。 在这种情况下我需要担心字节顺序吗?我什么时候需要担心它? 我的代码是简单的 C 和 SDL+GL,唯一复杂的数据是基本媒体文件 (png+wav+xm),游戏数据主要是字符串、整数布尔值(用于标志等)和静态大小的数组。到目前为止,没有用户遇到问题,所以我想知道是否需要添加检查(稍后会完成,但 IMO 有更紧急的问题)。

【问题讨论】:

  • 这个问题让我想起了已故的卡斯特将军。不知道到底为什么...
  • 字符串(来自资源文件)可能是个问题,如果您使用像 UTF-16 这样的编码,其中每个基本值大于 1 个字节。
  • 感谢您的回答。它确实是开源的,但主要是希望在传统的 PC 硬件上运行(老实说,我只做 linux 版本,因为它是我的主要操作系统,而且我更容易将工作负载放入其中)......基本上是 x86。没有联网数据,保存文件是非常简单的长字符串(我没有添加“保存黑客防御”......玩家最终决定,他们无论如何都会作弊)。游戏数据开放供用户编辑或获取。这意味着使用 mac 编辑或添加图片的人会导致崩溃或更糟? (没有明确的崩溃/调试输出的错误)
  • @kristoferA 有趣的是,你提到卡斯特是因为一个角色是基于他的......

标签: c endianness


【解决方案1】:

只有当您的游戏需要在不同的硬件架构上运行时,您才需要担心它。如果您确定它将始终在英特尔硬件上运行,那么您可以忘记它。如果它可以在 Linux 上运行,尽管许多人使用与 Intel 不同的架构,你最终可能不得不考虑它。

【讨论】:

  • 此外,它仅在计算机之间交换数据或以二进制格式存储数据时才重要。
  • 或者当你串行传输数据时,你必须选择先发送哪个字节。
【解决方案2】:

您是否以源代码形式分发游戏?

因为如果您仅将游戏作为二进制文件分发,那么您就可以确切地知道您的游戏将在哪些处理器系列上运行。此外,媒体文件是用户生成的(可能通过关卡编辑器)还是真的只能由您自己提供?

如果这是一个真正封闭的环境(您的分发二进制文件和游戏资产不打算定制),那么您知道您自己对字节序的风险,我个人不会愚弄它。

但是,如果您正在分发源代码和/或希望人们自定义他们的游戏,那么您可能会感到担忧。然而,随着现在大多数台式机/笔记本电脑转向 x86,我认为这是一个逐渐减少的问题。

【讨论】:

  • 我故意将数据文件“放在那里”,供用户获取/编辑/修改/添加内容。关卡使用编辑器,但输出又是种子和长字符串(我有点习惯了)。其余的都是程序性的。不可否认,大多数用户会接触到的版本将是 win32 版本,它将在分发时进行预编译。 (仅作为轶事,我使用过 linux 或源代码构建)谢谢您的回答。
【解决方案3】:

如果您指的是“标准游戏玩家硬件”的 PC,那么您不必担心字节序,因为它在 x86/x64 上始终是小字节序。但是如果你想将项目移植到其他架构,那么你应该独立设计它的字节序。

【讨论】:

  • 这掩盖了字节序问题中最重要的领域:网络编程。发送多字节值(如 int 或 long)时,始终在主机和网络字节顺序之间进行转换。
  • 好点,编程套接字时必须使用hton 和类似的函数。但您通常会使用抽象出这些差异的库。
  • @gnud:不,那是错误的。如果您希望您的所有服务器和客户端都是 little-endian,那么定义包含 little-endian 多字节值的格式或协议会很方便。每次通过网络发送 ZIP 文件时都会发生这种情况,因为 PKZIP 中的幻数和大小是 little-endian,而不是网络顺序。它还没有崩溃。如果您需要大端客户端或服务器,您可以根据需要安全地进行字节交换。 hton 是指定 IP 地址和端口所必需的,是指定字节序安全数据格式的一种便捷方式,但不是唯一方式。
  • 是的,我应该说'除非有线格式定义了字节序'。
【解决方案4】:

问题出现在网络、数据的发送方式以及您在不同的处理器上进行位摆弄时,因为不同的处理器可能会以不同的方式将数据存储在内存中。

【讨论】:

    【解决方案5】:

    每当您从网络接收/传输数据时,请记住转换到/从网络和主机字节顺序。此处应使用 C 函数 htons、htonl 等或您的语言中的等价函数。

    每当您从文件中读取多字节值(如 UTF-16 字符或 32 位整数)时,因为该文件可能源自具有不同字节顺序的系统。如果文件是 UTF 16 或 32,它可能有一个 BOM(字节顺序标记)。否则,文件格式必须以某种方式指定字节顺序。

    【讨论】:

      【解决方案6】:

      我相信 Power PC 具有与 Intel 主板相反的字节序。可能有一个例程来设置依赖于架构的字节顺序?我不确定您是否真的能说出代码中的硬件架构是什么……也许比我更聪明的人确实知道该问题的答案。

      现在参考您的“标准”游戏玩家硬件声明,我会说通常您会看到消费者现成的解决方案实际上是大多数标准游戏玩家正在使用的,所以您几乎要肯定会全面使用相同的字节序。我敢肯定有人会不同意我的观点,但那是我的 $.02

      哈...我刚刚注意到右边有一个与我上面的建议相关的链接。

      Find Endianness through a c program

      【讨论】:

        【解决方案7】:

        您需要担心字节顺序的时候:

        • 您正在机器或进程之间发送二进制数据(使用网络或文件)。如果机器可能有不同的字节顺序或使用的协议指定了特定的字节顺序(它应该),您需要处理字节序。
        • 您的代码通过不同类型的指针访问内存(例如,您通过char* 访问unsigned int 变量)。

        如果你做这些事情,无论你是否知道,你都在处理字节顺序 - 可能是你通过假设它是一种方式来处理它,只要你的代码可以正常工作不必处理不同的平台。

        以类似的方式,您通常需要在相同的情况下出于类似的原因处理对齐问题。再一次,您可能会通过什么都不做并让一切正常工作来处理它,因为您不必跨越平台边界(如果这确实成为要求,这可能会反过来让您陷入困境)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-09-22
          • 1970-01-01
          • 1970-01-01
          • 2014-06-10
          • 1970-01-01
          • 1970-01-01
          • 2010-10-28
          • 1970-01-01
          相关资源
          最近更新 更多