Willkommen bei dotnet-snippets.de! Snippet hinzufügen Login Registrieren
Snippets in der Datenbank: 1562 | Anzahl registrierter User: 1893 | Besucher online: 239
Hauptmenü
Home
Top Ten
Zufälliger Snippet
FAQs
.NET Community
dotnet-forum.de
dotnet-kicks.de
Social

RSS Feeds
Rss Alle Snippets
Rss C#
Rss VB.NET
Rss C++
Rss ASP.NET
Partner
Member of Microsoft Community Leader/Insider Program (CLIP)

Byte-Array in Struktur kopieren


Autor: Scavanger
Sprache: C#
Bewertung: 1,8
(1 Bewertung)
Anzahl der Aufrufe: 5356
  
Kick it on dotnet-kicks.de  

Beschreibung:

Gerade bei der Verwendung von binären Dateien kommt es vor das man auf C(++) Strukturen stößt.
Diese kann man natürlich mit der BinaryReader Klasse einlesen, was aber gerade bei größeren Strukturen recht mühsam sein kann.
Hier eine Alternative. Hier wird das ganze Array quasi "in einem Rutsch" in die Struktur kopiert.
Voraussetzung ist das (in C#) das StructLayout auf LayoutKind.Sequential gesetzt ist.

Diese Funktion ist dafür gedacht Strukturen aus unmanagend Code in eine verwaltete Struktur zu kopieren, nicht zum Deseralisieren von verwalteten Strukturen!

Verwendung:
[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)]
struct MyStruct
{
int foo1;
int foo2;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 10)]
string fooStr;
}

// ...
byte[] array = // ...

MyStruct myStruct = (MyStruct)ByteArrayToStruct(array, 0, typeof(MyStruct));


Abgelegt unter: struct, byte, array, Marshal, C, , C++, struktur, binär, datei, unmanagend.



C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/// <summary>
/// Kopiert Daten aus einem Byte-Array in eine entsprechende Strukture (struct). Die Struktur muss ein sequenzeilles Layout besitzen. ( [StructLayout(LayoutKind.Sequential)] 
/// </summary>
/// <param name="array">Das Byte-Array das die daten enthält</param>
/// <param name="offset">Offset ab dem die Daten in die Struktur kopiert werden sollen.</param>
/// <param name="structType">System.Type der Struktur</param>
/// <returns></returns>
static object ByteArrayToStruct(byte[] array, int offset, Type structType)
{
    if (structType.StructLayoutAttribute.Value != LayoutKind.Sequential)
        throw new ArgumentException("structType ist keine Struktur oder nicht Sequentiell.");

    int size = Marshal.SizeOf(structType);
    if (array.Length < (offset + size))
        throw new ArgumentException("Byte-Array hat die falsche Länge.");

    byte[] tmp = new byte[size];
    Array.Copy(array, offset, tmp, 0, size); 

    GCHandle structHandle = GCHandle.Alloc(tmp, GCHandleType.Pinned);
    object structure = Marshal.PtrToStructure(structHandle.AddrOfPinnedObject(), structType);
    structHandle.Free();

    return structure;
}
Sie haben Fragen zu diesem Snippet oder brauchen Hilfe bei der .NET Entwicklung?
Freundliche und kompetente Entwickler helfen Ihnen gern weiter im Forum für .NET Entwicklung.



Kommentare:
(Zum Schreiben von Kommentaren bitte anmelden.)



Diese Snippets könnten für Sie interessant sein:
[C#] arbeiten mit einem struct-Typ. Auflisten, zählen
[C#] IP Adresse in ByteArray
[C#] MAC in ByteArray
[C#] Kopierroutinen object <-> byte[]
[C#] String in Byte Array und zurück wandeln
[C#] Bitmap in Byte Array schreiben
[VB.NET] Create Nice File Size
[VB.NET] Umrechnung von Byte bis Yottabyte
[C#] byte-String in byte wandeln
[VB.NET] String in Byte Array und zurück wandeln
[C#] Netzwerktraffic anzeigen
[C#] Byte Größenangaben als String formatieren (KB, MB, GB, ...)
[C#] Datei Teilweise einlesen (gestückelt)
[C#] long in ein byte-Array kopieren
[C#] Prüfung, ob bestimmtes Bit in Byte gesetzt ist.
[C#] Setzt ein bestimmtes Bit in einem Byte
[VB.NET] Doppelte Einträge aus Arraylist löschen
[C#] Convert an ArrayList into an array
[C#] Arraylist in Textdatei schreiben
[C#] Wandelt ein Bytearray in einen Binärstring
[C#] BubbleSort Verfahren / Algorithmus
[VB.NET] Dateien nach Datum sortieren
[C#] Typ der Elemente in einem Array herausfinden
[VB.NET] Rows eines DataGridView in ein String-Array konvertieren
[VB.NET] Doppelte Arrayeinträge mit linearem Aufwand entfernen
[VB.NET] Listen, Arrays, Strings konvertieren
[VB.NET] Textdatei lesen und schreiben (String, StringArray, etc...)
[VB.NET] List all controls by using the name of the controls
[C#] Datei einlesen und als ArrayList jede Zeile zurückliefern
[C#] Eine allgemeine Liste (IEnumerable) in ein Array umwandeln
[C#] Array zur Laufzeit erweitern
[C#] Kleine Array-Erweiterung
[VB.NET] Doppelte Eintäge löschen
[C#] SortingHelper - MoveUpInList & MoveDownInList
[C#] Letzten Windows Fehler ausgeben
[C#] Integers
[C#] Search Plugin-DLLs with one line
[C#] sehr einfacher Timer
[C#] BindingList mit Sortierfunktion
[C#] Datei öffnen
[C#] ListView Spalten sortieren
[C#] Excel Spalten Bezeichnung nach Integer
[C#] Prozentual Textvergleichen
[C#] Console in eigene Form einbinden
[C#] Programm am Desktop andocken
[C#] lokale User und Gruppen administrieren
[C#] SimpleDb
[C#] Primärschlüsselwerte ermitteln
[C#] Automatisches Umbenennen eines Pfades
[C#] Connection-String Dialog öffnen
[C#] URL auslesen
[C#] Silverlight Anwendung erstellen
[C#] Text codieren
[VB.NET] ''Enter'' in TextBox
[C#] Programm RUN Check
[C#] Zufälliger Eintrag aus einer Liste (Extension Method)
[C#] XAML Grundlagen in Silverlight 3
[C#] MakeNiceSize()
[C#] 22 System Pfade abfragen
[C#] Zahlensysteme (BIN, HEX, OCT, DEZ) umrechnen
[C#] Erzeugen von Zeichenfolgen durch Permutation
[C#] Form ohne Rahmen verschieben
[C#]
[VB.NET] Treenode-Tags zur verwendung abfragen [für Anfänger]
[C#] String to char Tarnung
[C++] Hashtable in C++
[C++] Erstellt einen md5-Hash aus einem string
[C++] Flyff Paketfilter -> NPC anklicken blocken
[VB.NET] Dezimalzahl eines Binärwerts berechnen
[VB.NET] Binärwert einer Dezimalzahl berechnen
[VB.NET] Zahlen als Binär darstellen
[C#] Binärsuche innerhalb einer Liste
[C#] Binärdatei in XML File speichern
[C#] Binärdatei aus XML Datei auslesen und abspeichern
[C#] Laden und speichern von komprimierten Binärdaten
[C#] Dezimal in Binär umwandeln
[C#] Binärvergleich zweier Dateien
[VB.NET] Binäre Exponentation
[VB.NET] Größter gemeinsamer Teiler (2)
[VB.NET] Datei im Explorer anzeigen und markieren
[C#] Datei anlegen
[C#] Aktuelles Verzeichnis auslesen
[VB.NET] CRC32 Hash einer Datei berechnen
[VB.NET] Den MD5 Hash einer Datei ermitteln
[VB.NET] Datei mittels Windows Dialog löschen
[VB.NET] Datei mittels Windows Dialog verschieben
[VB.NET] Datei mittels Windows Dialog kopieren
[VB.NET] Den SHA1 Hash einer Datei ermitteln
[VB.NET] Prüfen ob Datei gerade benutzt wird
[C#] Dateien in die Zwischenablage kopieren
[ASP.net] Textdatei zum Download anbieten
[C#] MD5-Hash von Dateien ermitteln
[C#] Textdatei in Arraylist speichern
[C#] SHA-1 Hash einer Datei erzeugen
[VB.NET] Datei Paketweise Kopieren
[ASP.net] Datei nach Bildupload prüfen
[C#] Dateien suchen mit LINQ
[C#] Datei/Ordner durch Erweiterungsmethoden abfragen
[C#] Datei-Eigenschaften zeigen (Eigenschaften-Fenster)
[C#] CSV Dateien schreiben
[C#] Create Nice File Size in C#
[VB.NET] Programmpfad mittels Erweiterung ermitteln in VB
[C#] CSV und XML-Datei Datenbank-Import (incl. valid-check)
[C#] Datei umbenennen
[C#] Datei im Windows-Explorer anzeigen und markieren
[VB.NET] File Owner / File Besitzer
[VB.NET] wie in der CMD Pfad zu Datei ermitteln anhand des EXE-namens
[C#] Anzahl der Dateien in einem Ordner ermitteln
[VB.NET] Dateigröße als formatierter String
[VB.NET] Alle Dateien eines Ordners auflisten
[VB.NET] Den kurzen Pfad einer Datei ermitteln (8.3 Format)
[VB.NET] Klasse für Dateisuche
[C#] Erzeugen eines zufälligen Strings
[VB.NET] Dummy Datei erstellen
[C#] Datei in Papierkorb verschieben
[C#] Zeilen einer Datei zählen
[C#] Schreibschutz einer Datei setzen / entfernen
[ASP.net] Eine Datei zum Download anbieten
[VB.NET] Prüfen ob Dateiattribut vorhanden ist
[VB.NET] Bestimmtes Dateiattribut entfernen
[VB.NET] Datei ein bestimmtes Attribut geben
[VB.NET] Prüfen ob Datei eine EXE Datei ist
[C#] Prüfen, ob eine Datei ausfürbar ist (.exe, .bat, etc.)
[C#] Alle Dateien eines Ordners auflisten - C# Version -
[C#] eindeutigen Dateinamen ermitteln
[VB.NET] Datei-Inhalt anzeigen
[C#] Dateien und Ordner rekursiv löschen
[C#] Stream in Datei umleiten
[C#] Ordnergröße ermitteln
[C#] Kapazität mit Einheit darstellen
[C#] LogWriter klasse
[C#] MIMETypeManager
[C#] externes Programm aufrufen (andere Version) mit Parameter
[C#] Herausfinden welches Programm ein bestimmtes Dokument öffnet
[VB.NET] Gibt das Bytearray einer Datei zurück
[C#] Datei ein bestimmtes Attribut geben/setzen
[VB.NET] Klasse für SimpleFileVerification (SFV)
[C#] Parallele Dateisuche über mehrere Laufwerke
[C#] Textdatei einlesen auf verschiedene Arten
[C#] Bestimmte Zeile einer Datei löschen
[C#] File Container
[C#] PDF Dateien erstellen
[C#] Ist Datei beschreibbar
[C#] Sichern einer MS-SQLServer Datenbank aus C#
[C#] Datei mi GZip packen
[C#] ini Datei anlegen - mit Dictionary
[C#] Dummy Files erzeugen. ( Mit Inhalt )
[C#] Text in Textdateien suchen
[VB.NET] Prüfen, ob eine Datei überschrieben werden kann
[C#] Texteditor als for-Schleife verpackt
[C#] Alle Dateien und Verzeichnisse in einem Ordner löschen

schlecht sehr gut
1 2 3 4 5 6 7 8 9 10
Nur angemeldete User können Snippets bewerten.