Feedback

VB - Generic struct<->byte[] Marshalling

Veröffentlicht von am 27.06.2015
(0 Bewertungen)
A very small class that offers generic methods for marshalling byte arrays to structures and backwards. Structures must be signed as sequential by StructLayout attribute.
GFU-Schulungen  [Anzeige]

ASP.NET Core - Der Einstieg

In nur 3 Tagen lernen Sie, wie man mit ASP.NET Core und den Technologien MVC, Entity Framework, WebAPI und Razor professionelle Web-Anwendungs-Architekturen aufbaut. Diese Schulung ist der perfekte Einstieg, um datengetriebene und präsentations-orientierte Applikationen auf Basis der ASP.NET Core Plattform zu erstellen.

Angular mit ASP.NET Core für .NET-Entwickler

.NET ist Ihnen vertraut, als Entwickler verfügen Sie über einschlägige Kenntnisse. In diesem Kurs lernen Sie nun, Angular in .NET-Umgebungen einzusetzen. Sie verstehen das Konzept von Angular und integrieren das clientseitige JS-Framework sicher in.NET-Anwendungen.

Imports System.Runtime.InteropServices

Public Class SequentialStructureMarshalling

Public Shared Function StructureToByteArray(Of TStructure As Structure)(sourceStructure As TStructure) As Byte()
        Dim structureType As Type = GetType(TStructure)

        If structureType.StructLayoutAttribute.Value <> LayoutKind.Sequential Then
            Throw New ArgumentException("The generic type parameter TStructure must be sequential, but was not!", "TStructure")
        End If

        Dim structureSize As Integer = Marshal.SizeOf(structureType)
        Dim destinationPointer As IntPtr = Marshal.AllocHGlobal(structureSize)

        Marshal.StructureToPtr(sourceStructure, destinationPointer, True)

        Dim byteArray(structureSize - 1) As Byte

        Marshal.Copy(destinationPointer, byteArray, 0, structureSize)
        Marshal.FreeHGlobal(destinationPointer)

        Return byteArray
    End Function

    Public Shared Function ByteArrayToStructure(Of TStructure As Structure)(startIndex As Integer, ParamArray byteArray As Byte()) As TStructure
        If startIndex < 0 Then
            Throw New ArgumentException("The startIndex parameter must be greater than 0, but was not!", "startIndex")
        End If

        Dim structureType As Type = GetType(TStructure)

        If structureType.StructLayoutAttribute.Value <> LayoutKind.Sequential Then
            Throw New ArgumentException("The generic type parameter TStructure must be sequential, but was not!", "TStructure")
        End If

        Dim structureSize As Integer = Marshal.SizeOf(structureType)

        If byteArray.Length < (startIndex + structureSize) Then
            Throw New ArgumentException("The length of the byteArray parameter must be greater or equal to the structure length plus startIndex, but was not!", "array")
        End If

        Dim destinationPointer As IntPtr = Marshal.AllocHGlobal(structureSize)
        Marshal.Copy(byteArray, startIndex, destinationPointer, structureSize)

        Dim structureResult As TStructure = DirectCast(Marshal.PtrToStructure(destinationPointer, structureType), TStructure)
        Marshal.FreeHGlobal(destinationPointer)

        Return structureResult
    End Function

End Class
Abgelegt unter Marshalling, Byte, Array, Structure.

Kommentare zum Snippet

 

Logge dich ein, um hier zu kommentieren!