バイナリにC#可変長の構造を書き込み、C ++でそれを読みますか?
-
11-09-2019 - |
質問
わかりましたので、私はもっと私のC#/ C ++を教えるために私の小さなゲームエンジン上で動作するように続けています。今、私が作成した、バイナリ形式でデータを格納する方法を記述しようとしています。 (これは私が最初からこの私の自己をやりたい、学んでいます)。どのような私はC ++でそれを読んだとき、構造内部の可変長配列を扱うの最善の方法は何か疑問に思って?
例えば。ここに私は現在、私の構造を持っているものです。
[StructLayout(LayoutKind.Sequential)]
public struct FooBinaryHeader
{
public Int32 m_CheckSumLength;
public byte[] m_Checksum;
public Int32 m_NumberOfRecords;
public FooBinaryRecordHeader[] m_BinaryRecordHeaders;
public FooBinaryRecord[] m_BinaryRecords;
}
[StructLayout(LayoutKind.Sequential)]
public struct FooBinaryRecordHeader
{
public Int32 m_FileNameLength;
public char[] m_FileName;
public Int64 m_Offset;
}
[StructLayout(LayoutKind.Sequential)]
public struct FooBinaryRecord
{
public bool m_IsEncrypted;
public Int64 m_DataSize;
public byte[] m_Data;
}
今どのように私は実際にC ++での構造としてこれを読み込むためにC ++に行くでしょうか?私はちょっと1によって要素1のそれぞれを読み取り、構造にコピー周りに取得することを期待していた。
私はこの上で見つけた唯一の本当のチュートリアルはこれです:<のhref = "http://www.gamedev.net/community/forums/topic.asp?topic_id=310409&whichpage=1" のrel = "nofollowをnoreferrer" > http://www.gamedev.net/community/forums/topic.asp?topic_id=310409&whichpage=1 の
私は構造が正しく本当に不可能です++野生の推測を取ると、Cにこれを読ん言うでしょう?
解決
あなたはこれらの構造のコピーをマッピングするバイナリ形式からそれを読むことができます。各アレイは、ポインタとして扱われるべきである、あなたは、この配列のサイズの整数を持っている必要があります。
、例えば
C#
[StructLayout(LayoutKind.Sequential)] public struct A { public Int32 m_CheckSumLength; public byte[] m_Checksum; }
C ++
struct A { int length char* vector }
注:バイト文字の同じ大きさを有する
。は、バイナリから読み出すときは、最初の4バイトを読み出す(intは別名4バイト32である)、あなたが割り当てられたバッファに直接的に読み出され、構造体として扱うことができる。その後4 +(readed長さ)を割り当てることができます
他のヒント
構造体の可変長配列のようなものはありません。
私は、このような
のような構造のpoint
を持っていたと仮定
struct point
{
int x;
int y;
}
私はこれらの5の配列を望んでいた場合は、、コンパイラは、基本的に10個のint型のためのスペースを確保します。私は、それぞれが可変長配列が含まれているの構造体の配列、を求める場合はどうなりますか?私たちはそれぞれのために予約してどのくらいのスペースを知ることができないので、メモリのそれらを整列する方法はありません。
は、<全角>内容の行うことができますポインタが一定の大きさであるので、あなたは、可変長配列をたいの種類にのポインタを宣言することです。その後、あなたはそれをそのように十分にそのタイプのしかし、多くのインスタンスのメモリ、およびポイントを割り当てます。あなたはおそらく、あなたがセグメンテーションフォルトを危険にさらす前にポインタを過ぎて行くことができます正確にどのようにこれまで知っているので、また、構造体にlength
フィールドを追加する必要があります。
これは少し毛深いをマネージコードとアンマネージコードの間で前後に行くとメモリの割り当てと解放得るかもしれないが、それはどちらかといえば、一緒にC ++やC#を学ぶためのもう一つの良い運動です。
使用Marshall.StructToPtrと構造のコピー長。