質問
ようにしている読みのバイナリデータを使用C#.いすべてに関する情報をレイアウトのデータファイルにしたい。私は読むことのできるデータの"チャンクによるチャンク"、すなわちの第40バイトまでのデータに変換する文字列を取得し、次の40バイトまでとなります。
以降、少なくとも三若干バージョンの異なるデータのようなデータを読み込struct.気持ちく右より読みで"ラインライン"です。
また以下のようなアプローチの意義が無い:
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ら始めましたかに読み上げられる。を取得します AccessViolationExceptio
n利用の場合 Marshal.PtrToStructure
.
ストリームに含まれ以上の情報を私を読むよう造形、野暮ったすぎやしませんかにもデータの末尾にファイルです。
の構造体定義してい
[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;
}
の例のコードを変更したオリジナルからのこの質問になります。
はどのように読んだバイナリデータファイルから入struct?
正しい解決策はありません
他のヒント
問題は、 文字列ごstruct.これらの総力を結集し種のようなバイト/短期/int問題ありません;が必要なものmarshalな複合タイプなど、文字列として必要な構造体を明示的に模倣するポリタイプです。これまでのMarshalAs attrib.
おとえば、次の仕事:
[StructLayout(LayoutKind.Explicit)]
struct StructType
{
[FieldOffset(0)]
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 8)]
public string FileDate;
[FieldOffset(8)]
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 8)]
public string FileTime;
[FieldOffset(16)]
public int Id1;
[FieldOffset(20)]
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 66)] //Or however long Id2 is.
public string Id2;
}
ここには何を使用しています。
この取り組みが奏功した私にとって読みを携帯の実行形式です。
この汎用的機能も T
ご struct
タイプです。
public static T ByteToType<T>(BinaryReader reader)
{
byte[] bytes = reader.ReadBytes(Marshal.SizeOf(typeof(T)));
GCHandle handle = GCHandle.Alloc(bytes, GCHandleType.Pinned);
T theStructure = (T)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(T));
handle.Free();
return theStructure;
}
とRonnieと思利用BinaryReaderを読む各分野です。いての記事へのリンクはこの情報が観測されていることをBinaryReader読む各分野でより整理.PtrToStructの場合、構造体を含む以下の30-40います。私の記事へのリンクが見たいのです。
記事のリンクです http://www.codeproject.com/Articles/10750/Fast-Binary-File-Reading-with-C
が集中配列の構造体,PtrToStruct益を上手早くかのようなものと考えることができる分野としてカウント分野*配列の長さです。
また運用のBinaryFormatterないといけないと思い、思いついての完全なstructに一致するファイルのコンテンツです。を実感しているのかに興味が非常に多くのファイルコンテンツとにかくその情報セキュリティーコン読書の一部をストリームへのbytebufferを変換する使い分けて
Encoding.ASCII.GetString()
文字列および
BitConverter.ToInt32()
の整数です。
ずっと作りたいと思っていたにできる解析より、ファイルその後もこのバージョンからわずか数行のコードです。
と思いますかを問のコードです。
うん、何をしようとした場合におい手?な仕組みになっているのか。
BinaryReader reader = new BinaryReader(stream);
StructType o = new StructType();
o.FileDate = Encoding.ASCII.GetString(reader.ReadBytes(8));
o.FileTime = Encoding.ASCII.GetString(reader.ReadBytes(8));
...
...
...
もう
StructType o = new StructType();
byte[] buffer = new byte[Marshal.SizeOf(typeof(StructType))];
GCHandle handle = GCHandle.Alloc(buffer, GCHandleType.Pinned);
Marshal.StructureToPtr(o, handle.AddrOfPinnedObject(), false);
handle.Free();
その利用 バッファー[] おBinaryReaderの代わりにデータを読み込むからFileStreamいないかどうかを取得しAccessViolationます。
無かったのですが、運用の BinaryFormatterないといけないと思い、していま 完全なstructに一致する ファイルの内容をそうですね。
この意味で、BinaryFormatterは、独自のデータ形式に完全対応していない。
してみてください:
using (FileStream stream = new FileStream(fileName, FileMode.Open))
{
BinaryFormatter formatter = new BinaryFormatter();
StructType aStruct = (StructType)formatter.Deserialize(filestream);
}
読み直構造体は悪くは、Cプログラム以下で異なるバイトの秩序、異なるコンパイラの実装の分野で、パッキン、ワードサイズ.......
きのserialisingとdeserialisingバイトをバイトになります。利用には、スタッフたい場合にも慣れBinaryReader.