2012-03-08 53 views
2

为了节省空间,我决定使用二进制编码我的保存文件。每个字节代表一个瓦片类型的ID。这会导致不同的Endian计算出现问题吗?Endianness会成为这种二进制IO操作的问题吗?

此外,出于好奇,它是CPU或操作系统,其设置尾段类型?

附加信息:我正在使用C++并构建一个x平台游戏。我不想使用其他API,如Boost。

+2

“每个字节代表一个ID ...”。请注意,'字节',如char,unsigned char或uint8_t不受endian问题的影响。在字节级别,这些位全部以相同的顺序。 – 2012-03-08 05:39:52

回答

5

是的,它会引起问题 - 如果 BE上保存的文件被加载到LE上,反之亦然。这就是为什么一些Unicode编码(如UTF-16和UTF-32)具有所谓的字节顺序标记。

如果你的代码通常在编译你仍然必须确保该LE代码会利用数据的交换之前的字节顺序。

CPU将端模式和一些芯片(例如,一些MIPS CPU)的允许这样的自举系统时被切换。

+0

谢谢,这正是我正在寻找的。 – Johnathan 2012-03-08 02:12:57

3

我们可以使用更多的信息。跨平台是一回事,但是什么平台?如果您的意思是像x86 Mac,x86 Linux和x86 Windows这样的跨平台,那么您不需要担心它(尽管如果您尝试将结构体写入磁盘并使用不同的编译器进行编译,结构打包可能仍然是个问题不同的平台)。即使你有几个不同的OS/CPU组合,你也可以列出你想要支持的所有东西,如果它们都具有相同的字节顺序,不要担心。

如果你没有期望保存的数据将被从平台到平台的移动,你也不必担心。如果你想在一个big-endian机器上创建数据,然后在一个little-endian机器上读取数据,或者反之亦然,Endianess只是一个问题。如果这些只是本地数据文件,那么没有什么大不了的,尽管假设用户可以将他们的存档从一个平台复制到另一个平台可能是安全的,他们会这样做,因为他们会做很多你不想让​​他们做的事情并不支持。

此外,由于您只提个字节,如果字节数组是你的数据将会变得复杂,你其实并不需要担心字节序。这只是多字节数据类型的一个问题。因此,如果您只是保存字节数组,并且其余的簿记数据也适用于字节,则没有什么可担心的,但只要您保存一个short,int或float,就会有潜在的endian问题。

我个人的看法是,只要你需要序列化到字节序帐户,但我有一个非常multplatform背景(即运送同样的产品在5个游戏系统)。这很简单,交换宏已经存在,当你不可避免地决定转移到另一个endianess时,你将不必重写东西。如果数据更复杂或结构化,可以考虑使用协议缓冲区或BSON等库。

CPU和操作系统都可能导致永久性。从历史上看,它已经融入到CPU中,虽然x86仍然是小端的硬连线,但大多数现代RISC衍生产品都可以在任一模式下运行,使其成为硬件和操作系统开发人员的选择。

+0

我想补充一点,CPU的字大小也很重要(32位x86与64位x86_64),它们可能会影响默认打包。 – 2012-03-08 02:54:16

+0

良好的通话...包装就像Endianess的邪恶的兄弟姐妹一样,当你认为你明白你的所有与内存相关的序列化问题时,包装会发现破坏你的计划的方法。 – Suboptimus 2012-03-08 02:58:57