假设 windows 和 android 这两个系统都是 little endian,这在 ARM 和 x86/x64 CPU 中很常见,您可以执行以下操作。
首先:确定具有特定大小的类型,因此可以选择 double、64 位、float 和 32 位、uint64/32/16 或 int64/32/16。不要使用 int 或 long 之类的东西来确定您的数据类型。
第二种:使用以下方法写入二进制数据:
std::vector<uint64_t> myVec;
std::ofstream f("outputFile.bin", std::ios::binary);
f.write(reinterpret_cast<char*>(myVec.data()), myVec.size()*sizeof(uint64_t));
f.close();
在此,您将获取原始数据并将其二进制格式写入文件。
现在在其他机器上,确保您使用的数据类型具有相同的数据类型大小和相同的字节序。如果两者相同,您可以这样做:
std::vector<uint64_t> myVec(sizeOfTheData);
std::ifstream f("outputFile.bin", std::ios::binary);
f.read(reinterpret_cast<char*>(&myVec.front()), myVec.size()*sizeof(uint64_t));
f.close();
请注意,在读取数据之前,您必须知道数据的大小。
注意:这个代码是我的头。我还没有测试过,但它应该可以工作。
现在如果目标系统没有相同的字节序,你必须批量读取数据,翻转字节序,然后将它放入你的向量中。如何翻转字节序已被广泛讨论here。
为了确定您的系统的字节顺序,已讨论过here。
性能损失与这些系统的不同程度成正比。如果它们都是相同的字节顺序并且您选择相同的数据类型和大小,那么您很好并且您具有最佳性能。否则,您将受到一些惩罚,具体取决于您必须进行多少次转换。这是您能获得的最快速度。
来自 cmets 的注意事项:如果您要传输双精度或浮点数,请确保两个系统都使用 IEEE 754 标准。使用这些是很常见的,远远超过字节序,但只是为了确定。
现在,如果这些解决方案不适合您,那么您必须使用适当的序列化库来为您标准化格式。有一些库可以做到这一点,例如protobuf。