Перевод структур в байты и обратно - Visual Basic .NET
Формулировка задачи:
Всем здравствуйте.
Тема вытекла из Записать в файл структуру двоичных данных
Код рабочий рабочий 100 % (Памирыч, Sklifosofsky).
Помогите вынести содержимое Form_load в отдельную функцию с двумя параметрами (структура,массив) по аналогии с fnBytesToStruct. Я пробовал, у меня не выходит. Физики происходящего в коде не понимаю.
Листинг программы
- Imports System.Runtime.InteropServices
- Public Class Form1
- Structure StrCurrData
- Public t As Integer
- Public d As Short
- Public m As Short
- Public y As Short
- <VBFixedArray(99)> Public v() As Single
- End Structure
- Dim source As StrCurrData
- Dim dest As StrCurrData
- Dim ByteArray() As Byte
- 'Перевод структуры в байты
- Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
- ReDim source.v(99)
- source.t = 65535
- source.v(1) = 123.45
- Dim Ptr As IntPtr = Marshal.AllocHGlobal(Marshal.SizeOf(source))
- ReDim ByteArray(Marshal.SizeOf(source) - 1)
- Marshal.StructureToPtr(source, Ptr, False)
- Marshal.Copy(Ptr, ByteArray, 0, Marshal.SizeOf(source))
- Marshal.FreeHGlobal(Ptr)
- End Sub
- 'Private Function fnStructToBytes()
- 'End Function
- 'Из байтов в структуру
- Private Function fnBytesToStruct(ByVal Buff() As Byte, ByVal MyType As System.Type) As Object
- Dim MyGC As GCHandle = GCHandle.Alloc(Buff, GCHandleType.Pinned)
- Dim Obj As Object = Marshal.PtrToStructure(MyGC.AddrOfPinnedObject, MyType)
- Return Obj
- MyGC.Free()
- End Function
- Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
- dest = fnBytesToStruct(ByteArray, dest.GetType)
- Label1.Text = dest.t.ToString
- Label2.Text = dest.v(1).ToString
- End Sub
- End Class
Решение задачи: «Перевод структур в байты и обратно»
textual
Листинг программы
- Imports System.Runtime.InteropServices
- Public Class Form1
- <StructLayout(LayoutKind.Sequential, Pack:=1)> _
- Structure StrCurrData
- Public t As Integer
- Public d As Short
- Public m As Short
- Public y As Short
- <MarshalAs(UnmanagedType.ByValArray, SizeConst:=100)> Public v() As Single
- End Structure
- Dim source As StrCurrData
- Dim dest As StrCurrData
- Dim ByteArray() As Byte
- Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
- ReDim source.v(99)
- source.t = 65535
- source.v(1) = 123.45
- ByteArray = fnStructToBytes(source)
- End Sub
- 'из структуры в байты
- Private Function fnStructToBytes(ByVal MyStruct As StrCurrData) As Byte()
- Dim Buff() As Byte
- Dim size As Integer = Marshal.SizeOf(MyStruct)
- ReDim Buff(size - 1)
- Dim Ptr As IntPtr = Marshal.AllocHGlobal(Marshal.SizeOf(MyStruct))
- Marshal.StructureToPtr(MyStruct, Ptr, False)
- Marshal.Copy(Ptr, Buff, 0, size)
- Marshal.FreeHGlobal(Ptr)
- Return Buff
- End Function
- 'Из байтов в структуру
- Private Function fnBytesToStruct(ByVal Buff() As Byte, ByVal MyType As System.Type) As Object
- Dim MyGC As GCHandle = GCHandle.Alloc(Buff, GCHandleType.Pinned)
- Dim Obj As Object = Marshal.PtrToStructure(MyGC.AddrOfPinnedObject, MyType)
- MyGC.Free()
- Return Obj
- End Function
- Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
- dest = fnBytesToStruct(ByteArray, GetType(StrCurrData))
- Label1.Text = dest.t.ToString
- Label2.Text = dest.v(1).ToString
- End Sub
- End Class
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д