一个外部团队提供给我一个在Big Endian机器上编写的文件,他们还提供了一个用于该文件格式的C++解析器。
我只能在一个Little Endian机器上运行这个解析器 - 有没有办法在使用他们的解析器时不需要在每次读取后添加swapbytes()调用来读取文件?
一个外部团队提供给我一个在Big Endian机器上编写的文件,他们还提供了一个用于该文件格式的C++解析器。
我只能在一个Little Endian机器上运行这个解析器 - 有没有办法在使用他们的解析器时不需要在每次读取后添加swapbytes()调用来读取文件?
int getInt(char* bytes, int num) { int ret; assert(num == 4); ret = bytes[0] << 24; ret |= bytes[1] << 16; ret |= bytes[2] << 8; ret |= bytes[3]; return ret; }这可能比一般的
int i = *(reinterpret_cast<*int>(&myCharArray));
更耗时,但在大端和小端系统上始终正确。一般来说,这个问题没有“简单”的解决方案。您需要修改解析器,交换从文件中读取的每个整数的字节。
这取决于您对数据要进行什么操作。如果您要打印数据,则需要交换所有数字的字节顺序。如果您正在查找文件中的一个或多个值,则通过交换字节顺序可以更快地比较值。
总的来说,Greg是正确的,您必须以较为困难的方式完成此任务。
最好的方法是在文件格式中定义字节顺序,而不是说它取决于机器。 无论CPU运行在哪个机器上,编写者都必须按正确的顺序编写字节,读者也必须这样做。
如果您不想修改他们的解析器,您可以编写一个包装器来包装他们的解析器并反转字节。
请注意读入数据的类型。4字节的int
或float
需要进行大小端校正。4字节ASCII字符串则不需要。
一般而言,不能。
如果读/写调用不是类型感知的(例如fread和fwrite),那么它们无法区分写入大小端敏感数据和大小端不敏感数据。
根据解析器的结构,您可能可以避免某些痛苦,如果它们使用的I/O函数知道正在读取/写入的类型,则可以修改这些例程并应用正确的字节顺序转换。
如果确实必须修改所有读/写调用,则创建此类例程将是明智的选择。
你的问题有点包含了答案:不行!
我只能在小端机器上运行解析器 - 有没有办法在不添加swapbytes()调用的情况下使用他们的解析器读取文件?
如果你在小端机器上读取(并想要解释)大端数据,你必须在某个地方进行数据转换。你可以在每次读取后或者整个文件读取完毕后进行转换(如果读取的数据不包含如何读取进一步数据的信息) - 但是没有办法省略转换。
qemu
运行它 :D - ephemient