長さが事前に定義された長さであることがわかったので、次のステートメントがより明確になります。
この情報をデシリアライザに渡す方法がわかりません
実際、それは無意味になります。ここで役立つ定義済みのシリアライザーはありません。次の 2 つのオプションがあります。
A: 独自のシリアライザーを作成し、フォーマットがわかったところでデータを処理します。おそらく以下を使用しBinaryReader
ます。
using(var reader = new BinaryReader(source)) {
int in = reader.ReadInt32();
byte[] arr = reader.ReadBytes(32);
int[] arr2 = new int[4];
for(int i = 0 ; i < 4 ; i++) arr2[i] = reader.ReadInt32();
float fl = reader.ReadSingle();
var obj = /* something involving ^^^ */
}
B: 56 バイトをバッファリングし、非常に厄介な // ポインターバンギング コードをunsafe
使用fixed
する
最初に強くお勧めします。特に、これにより、必要に応じてエンディアンに対処することもできます。
あなたにとって神聖なすべての名において、これをしないでください:
using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Explicit)]
unsafe struct sample
{
[FieldOffset(0)] public int @in;
[FieldOffset(4)] public fixed byte arr[32];
[FieldOffset(36)] public fixed int arr2[4];
[FieldOffset(52)] public float fl;
}
static class Program
{
unsafe static void Main()
{
byte[] buffer = new byte[56];
new Random().NextBytes(buffer); // some data...
sample result;
fixed(byte* tmp = buffer)
{
sample* ptr = (sample*) tmp;
result = ptr[0];
}
Console.WriteLine(result.@in);
Console.WriteLine(result.fl);
}
}
より大きなバッファーの場合、インデックスによってアクセスされるptr
multiple の安全でない配列として扱うことができます。sample
int @in = ptr[i].@in;
(等)
しかし、正直なところ...それには非常に多くの「悪」があり、正直なところ、どこから始めればよいかわかりません...ただ...そこにあるすべての行が何をしているのかを完全に知っていない限り、以前にそれを行ったことがあり、すべてのトラップを理解する...それについて考えないでください