C#を使用してバイナリデータを読み込もうとしています。私は、読みたいファイルにデータのレイアウトに関するすべての情報を持っています。私はチャンクでチャンクを読むことができます。つまり、データの最初の40バイトを文字列に変換して次の40バイトを取得します。バイナリファイルを構造体に読み込みます。
少なくとも3つのバージョンのデータがあるため、データを構造体に直接読み込みたいと思います。それは "line by line"を読むことよりもはるかに正しいと感じます。
私は、次のアプローチを試みたが、無駄にしている:
StructType aStruct;
int count = Marshal.SizeOf(typeof(StructType));
byte[] readBuffer = new byte[count];
BinaryReader reader = new BinaryReader(stream);
readBuffer = reader.ReadBytes(count);
GCHandle handle = GCHandle.Alloc(readBuffer, GCHandleType.Pinned);
aStruct = (StructType) Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(StructType));
handle.Free();
ストリームは、私から読み始めているから開くのFileStreamです。 Marshal.PtrToStructure
を使用すると、AccessViolationExceptio
が返されます。
ストリームには、ファイルの最後のデータには興味がないので、私が読もうとしているよりも多くの情報が含まれています。例のコードは、この質問を短くするために、オリジナルから変更され
[StructLayout(LayoutKind.Explicit)]
struct StructType
{
[FieldOffset(0)]
public string FileDate;
[FieldOffset(8)]
public string FileTime;
[FieldOffset(16)]
public int Id1;
[FieldOffset(20)]
public string Id2;
}
:
構造体は、同じように定義されます。
ファイルからバイナリデータを構造体に読み込むにはどうすればよいですか?
BinaryFormatterには、バイナリデータ用の独自のフォーマットがあります。データを自分で読み書きする場合は、これが適切です。他のソースからファイルを取得している場合は役に立ちません。 – russau