VB.NETを使ってます。
バイト配列をInteger配列に一発でバイナリコピーすることは可能なのでしょうか?
Dim B(39) As Byte
Dim I(9) As Integer
できないとしたら、APIのCopyMemoryを使うしかないと思うのですが、
Destination As Any, Source As Any
はどう変更すればいいのでしょうか?
先頭アドレスを渡してやればコピーはできますが・・・
80x86系はリトルエンディアンですが、問題ありませんか?
> APIのCopyMemoryを使うしかないと思うのですが
APIを使わずとも、
1. Marshal.Copy メソッドで Byte() → IntPtr に複写
2. Marshal.Copy メソッドで IntPtr → Integer() に複写
という手順でコピーが可能ですよ。
ただ、CopyMemory API にしても Marshal.Copy にしても、アンマネージドな
操作になりますので、実行には UnmanagedCode パーミッションが必要になるかと。
メモリコピーを使わずに複写するなら、たとえば
With New IO.BinaryReader(New IO.MemoryStream(B))
For N = 0 To 9
I(N) = .ReadInt32()
Next
.Close()
End With
という感じですかね。ベタですけど。
Dim B(39) As Byte
Dim I(9) As Integer
Dim P As System.IntPtr
System.Runtime.InteropServices.Marshal.Copy(B, 0, P, 40)
System.Runtime.InteropServices.Marshal.Copy(P, I, 0, 40)
でいいのでしょうか?
しかしエラーが出ます。
'System.ArgumentNullException' のハンドルされていない例外が mscorlib.dll で発生しました。
追加情報 : 値を Null にすることはできません。
コピー先のメモリ(IntPtr)が空の状態でCopyしていませんか?
編集 削除空・・・?
すいません。私にはわかりません。
要するに、どうコーディングすればいいのか
(空じゃない状態にするには)
教えていただければ助かります。
今後VB.NETをする必要が無いので、今できればそれでいいんです。
> 要するに、どうコーディングすればいいのか
P = Marshal.AllocHGlobal(必要なメモリサイズ) 'メモリ確保
Marshal.Copy(B, 0, P, コピーする配列要素の数) 'Byte()→IntPtr
Marshal.Copy(B, I, 0, コピーする配列要素の数) 'IntPtr→Integer()
Marshal.FreeHGlobal(P)
> 今後VB.NETをする必要が無いので、今できればそれでいいんです。
今できればよいなら、別に一括コピーではなく、ベタに複写でも十分だったのでは。
「Dim B(39) As Byte」をInteger()にする程度なら、BitConverterなどで変換しながら
ループで単純代入を繰り返すだけでも、さほど手間では無いと思いますけれども……。
できました!
ありがとうございました。