Struct (Binärdaten) in eine Datei schreiben

  • 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;
}
  • Anwendungsbeispiel
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;
}