Перевод структур в байты и обратно - Visual Basic .NET

Узнай цену своей работы

Формулировка задачи:

Всем здравствуйте. Тема вытекла из Записать в файл структуру двоичных данных
Листинг программы
  1. Imports System.Runtime.InteropServices
  2. Public Class Form1
  3. Structure StrCurrData
  4. Public t As Integer
  5. Public d As Short
  6. Public m As Short
  7. Public y As Short
  8. <VBFixedArray(99)> Public v() As Single
  9. End Structure
  10. Dim source As StrCurrData
  11. Dim dest As StrCurrData
  12. Dim ByteArray() As Byte
  13. 'Перевод структуры в байты
  14. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  15. ReDim source.v(99)
  16. source.t = 65535
  17. source.v(1) = 123.45
  18. Dim Ptr As IntPtr = Marshal.AllocHGlobal(Marshal.SizeOf(source))
  19. ReDim ByteArray(Marshal.SizeOf(source) - 1)
  20. Marshal.StructureToPtr(source, Ptr, False)
  21. Marshal.Copy(Ptr, ByteArray, 0, Marshal.SizeOf(source))
  22. Marshal.FreeHGlobal(Ptr)
  23. End Sub
  24. 'Private Function fnStructToBytes()
  25. 'End Function
  26. 'Из байтов в структуру
  27. Private Function fnBytesToStruct(ByVal Buff() As Byte, ByVal MyType As System.Type) As Object
  28. Dim MyGC As GCHandle = GCHandle.Alloc(Buff, GCHandleType.Pinned)
  29. Dim Obj As Object = Marshal.PtrToStructure(MyGC.AddrOfPinnedObject, MyType)
  30. Return Obj
  31. MyGC.Free()
  32. End Function
  33. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  34. dest = fnBytesToStruct(ByteArray, dest.GetType)
  35. Label1.Text = dest.t.ToString
  36. Label2.Text = dest.v(1).ToString
  37. End Sub
  38. End Class
Код рабочий рабочий 100 % (Памирыч, Sklifosofsky). Помогите вынести содержимое Form_load в отдельную функцию с двумя параметрами (структура,массив) по аналогии с fnBytesToStruct. Я пробовал, у меня не выходит. Физики происходящего в коде не понимаю.

Решение задачи: «Перевод структур в байты и обратно»

textual
Листинг программы
  1. Imports System.Runtime.InteropServices
  2. Public Class Form1
  3.  
  4.     <StructLayout(LayoutKind.Sequential, Pack:=1)> _
  5.     Structure StrCurrData
  6.         Public t As Integer
  7.         Public d As Short
  8.         Public m As Short
  9.         Public y As Short
  10.         <MarshalAs(UnmanagedType.ByValArray, SizeConst:=100)> Public v() As Single
  11.     End Structure
  12.     Dim source As StrCurrData
  13.     Dim dest As StrCurrData
  14.     Dim ByteArray() As Byte
  15.  
  16.     Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  17.         ReDim source.v(99)
  18.         source.t = 65535
  19.         source.v(1) = 123.45
  20.         ByteArray = fnStructToBytes(source)
  21.     End Sub
  22.     'из структуры в байты
  23.     Private Function fnStructToBytes(ByVal MyStruct As StrCurrData) As Byte()
  24.         Dim Buff() As Byte
  25.         Dim size As Integer = Marshal.SizeOf(MyStruct)
  26.         ReDim Buff(size - 1)
  27.         Dim Ptr As IntPtr = Marshal.AllocHGlobal(Marshal.SizeOf(MyStruct))
  28.         Marshal.StructureToPtr(MyStruct, Ptr, False)
  29.         Marshal.Copy(Ptr, Buff, 0, size)
  30.         Marshal.FreeHGlobal(Ptr)
  31.         Return Buff
  32.     End Function
  33.     'Из байтов в структуру
  34.     Private Function fnBytesToStruct(ByVal Buff() As Byte, ByVal MyType As System.Type) As Object
  35.         Dim MyGC As GCHandle = GCHandle.Alloc(Buff, GCHandleType.Pinned)
  36.         Dim Obj As Object = Marshal.PtrToStructure(MyGC.AddrOfPinnedObject, MyType)
  37.         MyGC.Free()
  38.         Return Obj
  39.     End Function
  40.     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  41.         dest = fnBytesToStruct(ByteArray, GetType(StrCurrData))
  42.         Label1.Text = dest.t.ToString
  43.         Label2.Text = dest.v(1).ToString
  44.     End Sub
  45. End Class

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 3.769 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут