<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
'윈도우프로그래밍' 카테고리의 다른 글
[C#] 배열 또는 리스트에서 중복값 제거 (0) | 2018.01.27 |
---|---|
Visual Studio 2017 탐색모음 (Navigation bar) 표시 방법 (4) | 2018.01.24 |
Windows Installer 비정상 동작 시 조치 방법 (0) | 2018.01.17 |
InstallShield Limited Edition은 더 이상 Visual Studio Community Edition을 지원하지 않는다. (0) | 2018.01.17 |
[VB] .NET 올림, 반올림, 버림 (0) | 2017.08.09 |
[VB] .NET 컨트롤 타입 비교 (0) | 2017.08.09 |
[C#] .NET 배열 간 비교 (0) | 2017.04.10 |
GDI+에서 일반 오류가 발생했습니다. (0) | 2017.02.16 |