我看过无数关于字节序及其含义的参考资料。我对此没有任何问题......但是,我的编码项目是一个简单的游戏,可以在标准“游戏玩家”硬件上运行在 Linux 和 Windows 上。在这种情况下我需要担心字节顺序吗?我什么时候需要担心它?我的代码是简单的 C 和 SDL+GL,唯一复杂的数据是基本媒体文件(png+wav+xm),游戏数据主要是字符串、整数布尔值(用于标志等)和静态大小的数组。到目前为止,没有用户遇到问题,所以我想知道是否需要添加检查(稍后会完成,但 IMO 有更紧急的问题)。
7 回答
您需要担心字节顺序的时间:
- 您正在机器或进程之间发送二进制数据(使用网络或文件)。如果机器可能有不同的字节顺序或使用的协议指定了特定的字节顺序(它应该),你需要处理字节序。
- 您有通过不同类型的指针访问内存的代码(例如,您
unsigned int
通过 a 访问变量char*
)。
如果您做这些事情,无论您是否知道,您都在处理字节顺序 - 可能是您通过假设它是一种方式来处理它,只要您的代码没有,它就可以正常工作必须处理不同的平台。
同样,您通常需要在相同的情况下出于类似的原因处理对齐问题。再一次,你可能会通过什么都不做并且让一切正常工作来处理它,因为你不必跨越平台边界(如果这确实成为一个要求,这可能会反过来咬你)。
如果您指的是“标准游戏玩家硬件”的 PC,那么您不必担心字节顺序,因为它在 x86/x64 上总是小字节序。但是如果你想将项目移植到其他架构,那么你应该独立设计它的字节序。
每当您从网络接收/传输数据时,请记住转换到/从网络和主机字节顺序。应在此处使用C 函数htons
等或您的语言中的等效项。htonl
每当您从文件中读取多字节值(如 UTF-16 字符或 32 位整数)时,因为该文件可能源自具有不同字节顺序的系统。如果文件是 UTF 16 或 32,它可能有一个 BOM(字节顺序标记)。否则,文件格式必须以某种方式指定字节顺序。
如果您的游戏需要在不同的硬件架构上运行,您只需要担心它。如果您确信它将始终在英特尔硬件上运行,那么您可以忘记它。如果它可以在 Linux 上运行,尽管许多人使用与 Intel 不同的架构,你最终可能不得不考虑它。
您是否以源代码形式分发游戏?
因为如果您仅将游戏作为二进制文件分发,那么您确切地知道您的游戏将在哪些处理器系列上运行。此外,媒体文件是用户生成的(可能通过关卡编辑器)还是真的只能由您自己提供?
如果这是一个真正封闭的环境(您的分发二进制文件和游戏资产不打算定制),那么您知道自己对字节序的风险,我个人不会愚弄它。
但是,如果您正在分发源代码和/或希望人们自定义他们的游戏,那么您可能会担心。然而,随着现在大多数台式机/笔记本电脑转向 x86,我认为这是一个逐渐减少的问题。
问题出现在网络和数据的发送方式以及当您在不同的处理器上进行位摆弄时,因为不同的处理器可能会以不同的方式将数据存储在内存中。
我相信 Power PC 具有与英特尔板相反的字节序。可能有一个例程来设置依赖于架构的字节顺序?我不确定您是否真的能说出代码中的硬件架构是什么……也许比我更聪明的人确实知道该问题的答案。
现在参考您的声明“标准”游戏玩家硬件,我会说通常您会看到消费者现成的解决方案实际上是大多数标准游戏玩家正在使用的,所以您几乎肯定会得到全面相同的字节序。我敢肯定有人会不同意我的观点,但那是我的 $.02
哈...我刚刚注意到右边有一个与我上面的建议相关的链接。