반응형
* 구조체를 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
반응형
'VB.NET Programming' 카테고리의 다른 글
[VBNET] 숫자 (금액) 을 한글로 변환 (0) | 2020.01.14 |
---|---|
[VBNET] IP Ping Check (0) | 2020.01.10 |
[VBNET] [API] PC (종료, 재시작)또는 Diagnostics.Process 이용 PC 종료 (0) | 2020.01.06 |
[VBNET] 프로젝트 리소스 (Resources) 에 추가된 이미지 불러오기 (0) | 2020.01.02 |
[VBNET] PC 비프음 (Beep) (0) | 2019.12.25 |