ExtensionMethod.NET Home of 875 C#, Visual Basic, F# and Javascript extension methods

StructureToByteArray

Converts Structure To Byte-Array and back

Source

Imports System.Runtime.CompilerServices
Imports System.Runtime.InteropServices

Module StructureExtensions

    ''' <summary>
    ''' Converts simple structure to byte-array
    ''' </summary>
    ''' <typeparam name="T"></typeparam>
    ''' <param name="[structure]"></param>
    ''' <returns></returns>
    <Extension()>
    Public Function ToByteArray(Of T As Structure)(ByVal [structure] As T) As Byte()
        Dim bufferSize = Marshal.SizeOf([structure])
        Dim byteArray = New Byte(bufferSize - 1) {}
        Dim handle As IntPtr = Marshal.AllocHGlobal(bufferSize)
        Try
            Marshal.StructureToPtr([structure], handle, False)
            Marshal.Copy(handle, byteArray, 0, bufferSize)
        Finally
            Marshal.FreeHGlobal(handle)
        End Try

        Return byteArray
    End Function

    ''' <summary>
    ''' converts byte-array to simple structure
    ''' </summary>
    ''' <typeparam name="T"></typeparam>
    ''' <param name="bytearray"></param>
    ''' <returns></returns>
    <Extension()>
    Public Function ToStructure(Of T As Structure)(ByVal bytearray As Byte()) As T
        Dim [structure] As New T
        Dim len As Integer = Marshal.SizeOf([structure])
        Dim i As IntPtr = Marshal.AllocHGlobal(len)
        Marshal.Copy(bytearray, 0, i, len)
        [structure] = Marshal.PtrToStructure(i, [structure].[GetType]())
        Marshal.FreeHGlobal(i)
        Return [structure]
    End Function

End Module

Example

Public Structure TestStruct
    Dim x64 As Int64
    Dim str As String
    Dim truth As Boolean
    Dim x16 As Int16
End Structure

Dim tstrct As New TestStruct
tstrct.x64 = Int64.MaxValue
tstrct.truth = True
tstrct.str = "hello struct"
tstrct.x16 = 5


Dim fooba = tstrct.ToByteArray
Dim barstrct = fooba.ToStructure(Of TestStruct)
Dim yeah = barstrct.Equals(tstrct)

Author: Mike Lorenz

Submitted on: 17 apr 2018

Language: VB

Type: Structure

Views: 4562