- angelehnt an dieses Beispiel: Link
- Struct, das geschrieben werden soll, 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 des Structes in ein Byte-Array
/// <summary>
/// object to byte[] Serialisierung
/// </summary>
/// <param name="oData">Objekt zum Serialisieren</param>
/// <returns>Objekt als byte-Array</returns>
private byte[] RawSerialize(object oData)
{
byte[] byaRawData = null;
if (oData != null)
{
int iRawSize = Marshal.SizeOf(oData);
if (iRawSize > 0)
{
byaRawData = new byte[iRawSize];
IntPtr iptrBuffer = Marshal.AllocHGlobal(iRawSize);
Marshal.StructureToPtr(oData, iptrBuffer, false);
Marshal.Copy(iptrBuffer, byaRawData, 0, iRawSize);
Marshal.FreeHGlobal(iptrBuffer);
}
}
return byaRawData;
}
public bool WriteFile(string sFileName)
{
bool bRetVal = false;
try
{
// Datei öffnen
FileStream pFileStream = new FileStream(sFileName, FileMode.OpenOrCreate);
if (pFileStream != null)
{
// binär schreiben
BinaryWriter bw = new BinaryWriter(pFileStream);
// Struct erzeugen
MyStruct stHeader = new MyStruct();
// Daten eintragen
stHeader.sName = "Horst";
stHeader.iVersion = 2;
// Dateizeiger auf Dateianfang setzen
pFileStream.Seek(0, SeekOrigin.Begin);
// Header-Struct in Byte-Array wandeln
byte[] buf = RawSerialize(stHeader);
// Byte-Arry schreiben
bw.Write(buf);
pFileStream.Close();
pFileStream.Dispose();
bRetVal = true;
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
return bRetVal;
}