반응형

* 구조체를 Marshal 이용 바이트배열로 변환 하거나 바이트 배열화 된 구조체를 다시 원래 모습으로

   복귀 시키는 예제...

 

메인화면

전체 소스 코드

Form1.vb

 

Imports System.Runtime.InteropServices

Public Class Form1

    Structure t_TEST
        Public iTmp As Integer
        Public strTmp As String
        Public dbTmp As Double
        Public ftTmp As Single
    End Structure

    Dim tt As t_TEST = New t_TEST
    Dim bTmp() As Byte

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        tt.dbTmp = 0.12321312313
        tt.iTmp = 123123
        tt.strTmp = "테스트1"
        tt.ftTmp = 0.123213F
    End Sub

    Private Sub button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles button1.Click
        '구조체를 바이트 배열로...
        bTmp = StructToBytes(tt)
        label1.Text = bTmp.Length.ToString() + " bytes"
    End Sub

    Private Sub button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles button2.Click
        '바이트 배열을 다시 구조체로 변환...
        Dim tTmp As t_TEST = ByteToStruct(Of t_TEST)(bTmp)
        label2.Text = "int 값: " & tTmp.iTmp.ToString()
        label3.Text = "double 값: " & tTmp.dbTmp.ToString()
        label4.Text = "float 값: " & tTmp.ftTmp.ToString()
        label5.Text = "string 값: " & tTmp.strTmp
    End Sub

    Private Function StructToBytes(ByVal obj As Object) As Byte()

        '구조체 사이즈
        Dim iSize As Integer = Marshal.SizeOf(obj)

        '사이즈 만큼 메모리 할당
        Dim arr(iSize) As Byte
        Dim ptr As IntPtr = Marshal.AllocHGlobal(iSize)

        '구조체 주소값 가져오기
        Marshal.StructureToPtr(obj, ptr, False)
        '메모리 복사
        Marshal.Copy(ptr, arr, 0, iSize)
        '메모리 할당 받은거 해제
        Marshal.FreeHGlobal(ptr)

        Return arr

    End Function

    Private Function ByteToStruct(Of T As Structure)(ByVal buffer As Byte()) As T
        Dim size As Integer = Marshal.SizeOf(GetType(T))

        If size > buffer.Length Then
            Throw New Exception()
        End If

        Dim ptr As IntPtr = Marshal.AllocHGlobal(size)
        Marshal.Copy(buffer, 0, ptr, size)
        Dim obj As T = CType(Marshal.PtrToStructure(ptr, GetType(T)), T)
        Marshal.FreeHGlobal(ptr)
        Return obj
    End Function

End Class

 

* 실행한 결과...

 

결과화면

 

 

https://kdsoft-zeros.tistory.com/25

 

[C#] 구조체 를 바이트 배열로 또는 바이트 배열을 구조체로 변환

* 구조체를 Marshal 이용 바이트배열로 변환 하거나 바이트 배열화 된 구조체를 다시 원래 모습으로 복귀 시키는 예제... Form1.cs using System; using System.Collections.Generic; using System.ComponentMode..

kdsoft-zeros.tistory.com

 

반응형

+ Recent posts