본문 바로가기
윈도우프로그래밍

[VB] .NET 형변환 (Structure <-> Byte 배열)

by 바퀴 굴리는 프로그래머 2017. 7. 17.
반응형

<Class>

Public Function StructureToByteArray(ByRef obj As Object) As Byte()

        ' 구조체에 할당된 메모리의 크기를 구하기

        Dim objSize As Integer = Marshal.SizeOf(obj)

 

        ' 비관리 메모리 영역에 구조체 크기만큼의 메모리 할당

        Dim ptr As IntPtr = Marshal.AllocHGlobal(objSize)

 

        ' 구조체에 할당된 주소를 구하기

        Marshal.StructureToPtr(obj, ptr, False)

 

        ' 구조체가 복사될 배열 선언

        Dim buff(objSize - 1) As Byte

 

        ' 포인터가 가리키는 위치의 구조체의 값을 배열로 복사

        Marshal.Copy(ptr, buff, 0, objSize)

 

        ' 구조체를 위해 할당된 비관리 메모리 영역 해제

        Marshal.FreeHGlobal(ptr)

 

         ' 배열 리턴

 

        Return buff

End Function

 

Public Sub ByteArrayToStructure(ByRef obj As Object, ByRef buff() As Byte)

        ' 구조체에 할당된 메모리 크기 구하기

        Dim objSize As Integer = Marshal.SizeOf(obj)

 

        ' 비관리 메모리 영역에 구조체 크기만큼의 메모리 할당

        Dim ptr As IntPtr = Marshal.AllocHGlobal(objSize)

 

        ' 바이트 배열의 값을 구조체를 위해 할당한 포인터로 복사

        Marshal.Copy(buff, 0, ptr, objSize)

 

        ' 포인터가 가리키는 값을 구조체로 변환

        Marshal.PtrToStructure(ptr, obj)

 

        ' 구조체를 위해 할당된 비관리 메모리 영역 해제

        Marshal.FreeHGlobal(ptr)

 

End Sub


 

 

 

<Structure>

Public Function StructureToByte(ByVal obj As Object) As Byte()

        ' 구조체에 할당된 메모리 크기 구하기

        Dim objSize As Integer = Marshal.SizeOf(obj)

 

        ' 비관리 메모리 영역에 구조체 크기만큼의 메모리 할당

        Dim ptr As IntPtr = Marshal.AllocHGlobal(objSize)

 

        ' 할당된 구조체 객체의 주소를 구하기

        Marshal.StructureToPtr(obj, ptr, False)

 

        ' 구조체가 복사될 배열 선언

        Dim data As Byte() = New Byte(objSize - 1) {}

 

        ' 구조체를 배열에 복사

        Marshal.Copy(ptr, data, 0, objSize)

 

        ' 비관리 메모리 영역에 할당했던 메모리 해제

        Marshal.FreeHGlobal(ptr)

 

        ' 배열 리턴

        Return data

End Function

 

 

Public Function ByteToStructure(ByVal buff As Byte(), ByVal type As Type) As Object

        ' 배열의 크기만큼 비관리 메모리 영역에 메모리를 할당한다.

        Dim ptr As IntPtr = Marshal.AllocHGlobal(buff.Length)

 

        ' 바이트 배열의 값을 구조체를 위해 할당한 포인터로 복사

        Marshal.Copy(buff, 0, ptr, buff.Length)

 

        ' 복사된 데이터를 구조체로 변환

        Dim obj As Object = Marshal.PtrToStructure(ptr, type)

 

        ' 비관리 메모리 영역에 할당했던 메모리 해제

        Marshal.FreeHGlobal(ptr)

 

        ' 구조체와 원래의 데이터의 크기 비교

        If Marshal.SizeOf(obj) <> buff.Length Then Return Nothing

 

        ' 구조체 리턴

        Return obj

End Function

 

반응형