我有一个具有挑战性的情况;我们将在 Mac、PC、iOS 和 Android 上安装程序,以接收传统格式的文件并解析这些文件中的数据。我们无法更改这些文件的创建方式。
这些文件是由一个 C++ 程序生成的,它用数字和字符串填充一个结构,然后把它写出来。这是一个经过消毒的版本。
struct MyObject {
String Kfkj(MAXKYS);
String Oern(MAXKYS);
String Vdflj(MAXKYS, 9);
int Muic;
int Tdfkj;
int VdfkAsdk;
int SsdjsdDsldsk;
int Ndsoief;
String TdflsajPdlj;
String TdckjdfPas;
String AdsfakjIdd;
int IdkfjdKasdkj;
int AsadkjaKadkja(MAXKYS);
int Kasldsdkj;
bool Usadl;
String PsadkjOasdj(9);
String PasdkjOsdkj;
};
如您所见,原语和字符串。
然后这是他们将其写入文件的方式:
MyInstance MyObject;
FileName = "C:\MyFile.ab2"
ofstream fout (FileName, ios::binary);
fout.write((char*)& MyInstance, sizeof(MyInstance));
我们没有选择翻译一次然后将文件分发到其他平台;我们必须在每一个不同的平台上翻译它,这就是我们必须合作的。我很感激有关 C++ 如何序列化数据的任何信息,因此我们知道如何解析文件。
编辑:解决方案
我从这里的多个答案中收到的反馈非常有帮助。使用它,我使用十六进制编辑器进行了广泛的分析并发现:
- 元素一个接一个地进入文件
- 在这种情况下,“字符串”以一个 int 开头,描述了该字符串的 int 后面有多少个字符。如果 String 不存在,它仍然具有值为 0 的 int。
- 对于我看到的文件和机器,整数是两个字节,小端,并且大部分是无符号的(有一些是有符号的,只是为了让我保持警惕)
- 布尔值是两个字节,显然 -1 (FF FF) 代表“真”
到目前为止,我们还没有遇到不同设备上不同填充或字节序的问题,但这些都是非常现实的问题。这些答案中熟练的注释和警告为我们提供了更多的弹药来尝试说服客户更改为更不脆弱的替代方案,例如 XML 或 JSON,以便跨平台在线传输数据。
至于那些询问开发人员是否被解雇的人......好吧,我们只是说他们的代码很旧,但经过多次对话,我们仍然无法说服他们写出 C++ 结构并尝试在不同平台上阅读它这不是一个好主意。