私には困難な状況があります。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 ++がデータをシリアル化する方法についての情報をいただければ幸いです。そのため、ファイルを解析する方法を知っています。
編集:ソリューション
ここで複数の回答から受け取ったフィードバックは非常に役に立ちました。それを使用して、16進エディターで広範な分析を行い、次のことを発見しました。
- 要素は次々にファイルに入ります
- この場合の「文字列」は、その文字列のintに続く文字数を表すintで始まります。文字列が存在しない場合でも、値が0のintが含まれます。
- 私が見たファイルとマシンの整数は、2バイトで、リトルエンディアンであり、ほとんど署名されていません(署名されたものがいくつかありましたが、私をつま先に置いておくためです)
- ブール値は2バイトで、明らかに-1(FF FF)は「真」を表します
これまでのところ、さまざまなデバイスでさまざまなパディングやエンディアンの問題が発生したことはありませんが、これらは非常に現実的な懸念事項です。これらの回答の熟練したメモと警告は、プラットフォーム間でデータをオンラインで転送するために、XMLやJSONなどの脆弱性の低い代替手段に変更するようにクライアントを説得するための弾薬を提供します。
開発者が解雇されたかどうかを尋ねる人は...まあ、彼らのコードは非常に古いとだけ言っておきましょう。しかし、何度も話し合った後でも、C++構造体を書き出して別のプラットフォームで読み込もうとするのに苦労しています。良い考えではありません。