我有一个双打的二进制文件,我需要使用C ++加载。但是,我的问题是它是用big-endian格式编写的,但是fstream>>然后,操作员将读取错误的数字,因为我的机器是小端的。解决整数似乎是一个简单的问题,但对于双精度和浮点数,我找到的解决方案将无效。我怎样(或者我应该)解决这个问题?
我把它读作整数字节交换的参考:
How do I convert between big-endian and little-endian values in C++?
编辑:虽然这些答案很有启发性,但我发现我的问题在于文件本身而不是二进制数据的格式。我相信我的字节交换确实有效,我只是得到了令人困惑的结果。谢谢你的帮助!
答案 0 :(得分:6)
最便携的方法是以文本格式序列化,这样就不会出现字节顺序问题。这就是operator>>
的工作原理,因此您不应该遇到>>
的任何字节序问题。二进制格式(可以解释字节序问题)的主要问题是浮点数由多个尾数位,多个指数位和一个符号位组成。指数可以使用偏移量。这意味着直接字节重新排序可能不够,具体取决于源和目标格式。
如果您在两台计算机上使用IEEE-754,那么您可以使用直接字节反转,因为此标准指定了一个应该是可移植的位串交换格式(除了字节顺序问题)。
如果必须在两个机器架构之间进行转换,并且必须使用原始字节内存转储,那么只要基本数字格式相同(即它们在数字的每个部分中具有相同的位数),你可以将数据读入unsigned char
数组,使用一些基本的字节和位交换例程来纠正存储格式,然后将原始字节复制到适当类型的变量中。
答案 1 :(得分:0)
标准转换运算符不适用于二进制数据,所以不清楚你是如何得到的。
但是,由于字节交换是对字节而不是数字进行操作,因此您将对作为浮点数据的数据执行它,就像整数数据一样。
由于文本效率太低而且浮点数据集往往太大,所以想要这样做是完全合理的。
int32_t raw_bytes;
stream >> raw_bytes; // not an int, just 32 bits of bytes
my_byte_swap( raw_bytes ); // swap 'em
float f = * reinterpret_cast< float * >( & raw_bytes ); // read them into FPU