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

解決


Patricia  2005-01-21 19:56:17  No: 119091

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 21:30:26  No: 119092

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


魔界の仮面弁士  2005-01-21 22:49:30  No: 119093

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

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

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


魔界の仮面弁士  2005-01-21 22:53:46  No: 119094

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


Patricia  2005-01-21 23:48:08  No: 119095

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-22 00:36:44  No: 119096

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


Patricia  2005-01-22 00:59:47  No: 119097

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


魔界の仮面弁士  2005-01-22 01:48:09  No: 119098

> 要するに、どうコーディングすればいいのか
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-22 03:00:58  No: 119099

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


※返信する前に利用規約をご確認ください。




  


  このエントリーをはてなブックマークに追加