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

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

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

Всем здравствуйте. Тема вытекла из Записать в файл структуру двоичных данных
Код рабочий рабочий 100 % (Памирыч, Sklifosofsky). Помогите вынести содержимое Form_load в отдельную функцию с двумя параметрами (структура,массив) по аналогии с fnBytesToStruct. Я пробовал, у меня не выходит. Физики происходящего в коде не понимаю.

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

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

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


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

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

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