• 締切済み

VB2005でバイト配列をコピーするには

どなたかご教授下さい。 VB6で作成したプログラムをVB2005にコンバートしました。構造体からなる配列変数を一つの配列変数にコピー したいのですが、構造体の最初のメンバーだけ値が同じで以降の値は正しくセットされていませんでした。 どのように記述したらよいのでしょうか。またCopymMemory以外で良い方法があればご教授下さい。 よろしくお願い致します。 ===概略=== Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByRef Destination As Byte, ByRef Source As Byte, ByVal Length As Short) 構造体定義 (コピー元) <StructLayout(LayoutKind.Sequential)>Structure ST_MOTO <MarshalAs(UnmanagedType.ByValArray, SizeConst:=4)> Dim byte_strTranCd() As Byte <MarshalAs(UnmanagedType.ByValArray, SizeConst:=5)> Dim byte_strTanSeq() As Byte <MarshalAs(UnmanagedType.ByValArray, SizeConst:=2)> Dim byte_strTxtNo() As Byte <MarshalAs(UnmanagedType.ByValArray, SizeConst:=3)> Dim byte_strTxtSeq() As Byte End Structure Dim A As ST_MOTO (コピー先) <StructLayout(LayoutKind.Sequential)> Structure ST_SAKI Dim lngrecLen As Integer 'データのLength <MarshalAs(UnmanagedType.ByValArray, SizeConst:=100)> Dim bytrecData() As Byte 'データ End Structure Dim B As ST_SAKI Call CopyMemory(B.bytrecData(0), A.byte_strTranCd(0), 14) 出力結果 '最初の構造体のメンバーの値は正しく設定されている B.bytrecData(0) =80    A.byte_strTranCd(0) =80 B.bytrecData(1) =50    A.byte_strTranCd(1) =50 B.bytrecData(2) =57    A.byte_strTranCd(2) =57 B.bytrecData(3) =50    A.byte_strTranCd(3) =50 'これ以降は正しくない。(VB6だと正しく設定されている) B.bytrecData(4) =0     A.byte_strTanSeq(0) =80 B.bytrecData(5) =0     A.byte_strTanSeq(1) =87 B.bytrecData(6) =0     A.byte_strTanSeq(2) =48 B.bytrecData(7) =0     A.byte_strTanSeq(3) =48 B.bytrecData(8) =6     A.byte_strTanSeq(4) =55     ・              ・     ・              ・

みんなの回答

回答No.2

訂正: A.byte_strTranCd(0) ではなく A です。 例によって何故動作するかわからんけど。

回答No.1

Option Explicit On Option Strict On Option Compare Binary Option Infer Off '質問掲示のソースがうまく行かない理由はよくわからん 'この辺勉強してないので。 'とりあえず,適当に弄ってたらうまく行ってしまったパターン。 '何故うまくいかないのかを調べて補足してくれるとありがたい Imports System.Runtime.InteropServices Namespace Q3770770A <StructLayout(LayoutKind.Sequential)>Structure ST_MOTO <MarshalAs(UnmanagedType.ByValArray, SizeConst:=4)> Dim byte_strTranCd As Byte() <MarshalAs(UnmanagedType.ByValArray, SizeConst:=5)> Dim byte_strTanSeq As Byte() <MarshalAs(UnmanagedType.ByValArray, SizeConst:=2)> Dim byte_strTxtNo As Byte() <MarshalAs(UnmanagedType.ByValArray, SizeConst:=3)> Dim byte_strTxtSeq As Byte() End Structure <StructLayout(LayoutKind.Sequential)> Structure ST_SAKI Dim lngrecLen As Integer 'データのLength <MarshalAs(UnmanagedType.ByValArray, SizeConst:=100)> Dim bytrecData As Byte() 'データ End Structure Class Q3770770 Private Declare Sub CopyMemory Lib "kernel32" Alias _ "RtlMoveMemory" (ByRef Destination As Byte , ByRef _ Source As ST_MOTO , ByVal Length As Integer) Public Shared Sub Main(args As String()) Dim A As ST_MOTO Dim B As ST_SAKI ReDim A.byte_strTranCd(3) ReDim A.byte_strTanSeq(4) ReDim A.byte_strTxtNo(1) ReDim A.byte_strTxtSeq(2) ReDim B.bytrecData(100) A.byte_strTranCd(0) = System.Convert.ToByte(80) A.byte_strTranCd(1) = System.Convert.ToByte(50) A.byte_strTranCd(2) = System.Convert.ToByte(57) A.byte_strTranCd(3) = System.Convert.ToByte(50) 'これ以降は正しくない。(VB6だと正しく設定されている) A.byte_strTanSeq(0) = System.Convert.ToByte(80) A.byte_strTanSeq(1) = System.Convert.ToByte(87) A.byte_strTanSeq(2) = System.Convert.ToByte(48) A.byte_strTanSeq(3) = System.Convert.ToByte(48) A.byte_strTanSeq(4) = System.Convert.ToByte(55) A.byte_strTxtNo(0) = System.Convert.ToByte(80) A.byte_strTxtNo(1) = System.Convert.ToByte(87) A.byte_strTxtSeq(0) = System.Convert.ToByte(80) A.byte_strTxtSeq(1) = System.Convert.ToByte(87) A.byte_strTxtSeq(2) = System.Convert.ToByte(48) Call CopyMemory(B.bytrecData(0), A.byte_strTranCd(0), 14) For i As Integer = 0 To 13 System.Console.WriteLine(i.toString & ":" & B.bytrecData(i).toString()) Next System.Console.ReadKey(True) End Sub End Class End Namespace

関連するQ&A