- angelehnt an dieses Beispiel: Link
- Struct, was man einlesen will, definieren
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
// Daten sequentiell anordnen
[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Ansi)]
public struct MyStruct
{
// String zum Einlesen von char-Arrays fester Länge nutzen, hier 32 Zeichen
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
public string sName;
// char-Arrays können auch wie folgt eingelesen werden
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
public char[] cName2;
// int einlesen
public Int32 iVersion;
}
- Hilfsfunktion zum konvertieren eines Byte-Arrays in das definierte Struct
/// <summary>
/// byte[] to object De-Serialisierung
/// </summary>
/// <param name="byaRawData">Eingangsdaten als byte-Array</param>
/// <param name="tyObjectDataType">Struct-Typ, in den byaRawData konvertiert werden soll</param>
/// <returns>deserialisiertes Objekt</returns>
private object RawDeserialize(byte[] byaRawData, Type tyObjectDataType)
{
object oRetObj = null;
int iRawSize = Marshal.SizeOf(tyObjectDataType);
if (iRawSize == byaRawData.Length)
{
IntPtr iptrBuffer = Marshal.AllocHGlobal(iRawSize);
Marshal.Copy(byaRawData, 0, iptrBuffer, iRawSize);
oRetObj = Marshal.PtrToStructure(iptrBuffer, tyObjectDataType);
Marshal.FreeHGlobal(iptrBuffer);
}
return oRetObj;
}
public bool ReadFile(string sFileName)
{
bool bRetVal = false;
try
{
// Datei öffnen
FileStream pFileStream = new FileStream(sFileName, FileMode.OpenOrCreate);
if (pFileStream != null)
{
// binär lesen
BinaryReader br = new BinaryReader(pFileStream);
// Puffer einlesen
byte[] buf = br.ReadBytes(Marshal.SizeOf(typeof(MyStruct)));
// Byte-Puffer als MyStruct uminterpretieren
MyStruct stHead = (MyStruct)RawDeserialize(buf, typeof(MyStruct));
string sName = stHead.sName;
Int32 iVersion = stHead.iVersion;
// aufräumen
pFileStream.Close();
pFileStream.Dispose();
bRetVal = true;
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
return bRetVal;
}