前回はバイト配列から構造体へのコピーでしたが、今回はその逆である、構造体からバイト配列へのコピーです。
例とする構造体は前回同様、4個のバイト配列変数を持った簡単な構造を例にとります。以下の様な宣言になります。 各変数は「MarshalAs」を使って、固定サイズ長を宣言してやります。
この構造体からバイト配列に変換する関数を以下に示します。
バイト配列の「x2」には20個分の配列として値が返されます。
=====
2015/03/20:の時の情報
例とする構造体は前回同様、4個のバイト配列変数を持った簡単な構造を例にとります。以下の様な宣言になります。 各変数は「MarshalAs」を使って、固定サイズ長を宣言してやります。
'バイト配列分解構造体 <StructLayout(LayoutKind.Sequential, Pack:=1)> _ Private Structure ByteSplit <MarshalAs(UnmanagedType.ByValArray, SizeConst:=2)> _ Public A As Byte() <MarshalAs(UnmanagedType.ByValArray, SizeConst:=4)> _ Public B As Byte() <MarshalAs(UnmanagedType.ByValArray, SizeConst:=4)> _ Public C As Byte() <MarshalAs(UnmanagedType.ByValArray, SizeConst:=64)> _ Public X As Byte() End Structure
この構造体からバイト配列に変換する関数を以下に示します。
Imports System.Runtime.InteropServices 'これは先頭で宣言してください '''''' 構造体からバイト配列にコピーする ''' ''' <param name="byteSplit">構造体</param> ''' <returns>バイト配列を返す</returns> Private Function ToByteArray(ByVal byteSplit As ByteSplit) As Byte() '構造体のサイズ Dim size As Integer = Marshal.SizeOf(GetType(ByteSplit)) 'ヒープ領域にサイズ分のメモリ確保 Dim iPtr As IntPtr = Marshal.AllocHGlobal(size) '構造体をヒープ領域にコピー Marshal.StructureToPtr(byteSplit, iPtr, False) 'Byte配列の宣言 Dim newBytes As Byte() = New Byte(size - 1) {} 'ヒープ領域からByte配列にコピー Marshal.Copy(iPtr, newBytes, 0, size) 'ヒープ領域を解放 Marshal.FreeHGlobal(iPtr) 'バイト配列を返す Return newBytes End Function 'バイト配列を構造体にコピーするテスト Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click Dim x As Byte() = New Byte() {&H10, &H11, &H20, &H21, &H22, &H23, &H30, &H31, &H32, &H33, &H40, &H41} '前回の関数(バイト配列を構造体にコピー)を利用 Dim xByte As ByteSplit = ToByteSplit(x) Dim x2 As Byte() = ToByteArray(xByte) End Sub
バイト配列の「x2」には20個分の配列として値が返されます。
=====
2015/03/20:の時の情報
PR
コメント