バイト配列をInteger配列にコピーするには?

解決


Patricia  2005-01-21 10:56:17  No: 119091  IP: [192.*.*.*]

VB.NETを使ってます。
バイト配列をInteger配列に一発でバイナリコピーすることは可能なのでしょうか?
   
    Dim B(39) As Byte
    Dim I(9) As Integer

できないとしたら、APIのCopyMemoryを使うしかないと思うのですが、
Destination As Any, Source As Any
はどう変更すればいいのでしょうか?

編集 削除
Say  2005-01-21 12:30:26  No: 119092  IP: [192.*.*.*]

先頭アドレスを渡してやればコピーはできますが・・・
80x86系はリトルエンディアンですが、問題ありませんか?

編集 削除
魔界の仮面弁士  2005-01-21 13:49:30  No: 119093  IP: [192.*.*.*]

> APIのCopyMemoryを使うしかないと思うのですが

APIを使わずとも、
 1. Marshal.Copy メソッドで Byte() → IntPtr に複写
 2. Marshal.Copy メソッドで IntPtr → Integer() に複写
という手順でコピーが可能ですよ。

ただ、CopyMemory API にしても Marshal.Copy にしても、アンマネージドな
操作になりますので、実行には UnmanagedCode パーミッションが必要になるかと。

編集 削除
魔界の仮面弁士  2005-01-21 13:53:46  No: 119094  IP: [192.*.*.*]

メモリコピーを使わずに複写するなら、たとえば
   With New IO.BinaryReader(New IO.MemoryStream(B))
       For N = 0 To 9
           I(N) = .ReadInt32()
       Next
       .Close()
   End With
という感じですかね。ベタですけど。

編集 削除
Patricia  2005-01-21 14:48:08  No: 119095  IP: [192.*.*.*]

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 にすることはできません。

編集 削除
魔界の仮面弁士  2005-01-21 15:36:44  No: 119096  IP: [192.*.*.*]

コピー先のメモリ(IntPtr)が空の状態でCopyしていませんか?

編集 削除
Patricia  2005-01-21 15:59:47  No: 119097  IP: [192.*.*.*]

空・・・?
すいません。私にはわかりません。
要するに、どうコーディングすればいいのか
(空じゃない状態にするには)
教えていただければ助かります。
今後VB.NETをする必要が無いので、今できればそれでいいんです。

編集 削除
魔界の仮面弁士  2005-01-21 16:48:09  No: 119098  IP: [192.*.*.*]

> 要するに、どうコーディングすればいいのか
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などで変換しながら
ループで単純代入を繰り返すだけでも、さほど手間では無いと思いますけれども……。

編集 削除
Patricia  2005-01-21 18:00:58  No: 119099  IP: [192.*.*.*]

できました!
ありがとうございました。

編集 削除