忍者ブログ

VB.NET-TIPS などプログラミングについて

VB.NETのTIPS(小技集)を中心に、Javascript、PHP その他のプログラミングについて少し役に立つ情報を発信します。いわゆる個人的な忘備録ですが、みなさんのお役に立てれば幸いです。

VB.NET:マーシャリングを使用した、構造体からバイト配列へのコピー
前回はバイト配列から構造体へのコピーでしたが、今回はその逆である、構造体からバイト配列へのコピーです。
例とする構造体は前回同様、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

コメント

コメントを書く