DOBON.NET DOBON.NETプログラミング掲示板過去ログ

バイナリデータファイルから配列化した構造体に入れる方法

環境/言語:[XP,vb.net(vs2008)]
分類:[.NET]

VB.net(XP:VS2008のみフルインストール)にて
バイナリデータファイルから入力したデータを
配列化した構造体bn_dataに入れたいと考えています。
ネットで検索したのですが、いまいち方法がわかりません。

どなたか、お教え願えないでしょうか?

構造体
  ---------------------------------------------------------
<StructLayout(LayoutKind.Sequential)> _
Public Structure bn_file
Public aa As Integer
Public bb As Integer
Public cc As Integer
<VBFixedString(4), System.Runtime.InteropServices.MarshalAs _
(System.Runtime.InteropServices.UnmanagedType.ByValTStr, _
SizeConst:=4)> Public dd As String
End Structure

読み込み部分
  ---------------------------------------------------------
Dim bn_data(10) As bn_file
Dim fileNm As String
fileNm = 読み込むバイナリデータファイル名
☆ Dim btBuf As Byte() = My.Computer.FileSystem.ReadAllBytes(fileNm)

Dim gArray2 As System.Runtime.InteropServices.GCHandle = _
System.Runtime.InteropServices.GCHandle.Alloc(btBuf, _
GCHandleType.Pinned)
Dim gAddress2 As Integer = gArray2.AddrOfPinnedObject().ToInt32
★ Dim gArray1 As System.Runtime.InteropServices.GCHandle = _
System.Runtime.InteropServices.GCHandle.Alloc(bn_data, _
GCHandleType.Pinned)
Dim gAddress1 As Integer = gArray1.AddrOfPinnedObject().ToInt32

△ MoveMemory(gAddress1, gAddress2, btBuf.Length)

gArray2.Free()
gArray1.Free()

☆の部分でファイルからバイト配列に読み込み、
△の部分でバイト配列から構造体に入れようと考えましたが、
★印のところで以下のエラーとなってしまいます。
 「ArgumentExceptionはハンドルされませんでした。
  オブジェクトにプリミティブでないか、またはblittableでないデータが
  含まれています。」

よろしくお願いします。
■No28151に返信(のんさんの記事)

> Public dd As String
がエラーの原因になっているかと思います。

BinaryReaderで1個づつ読むのは駄目ですか?

shuさん返信ありがとうございます。

その後、さらにネットでいろいろ検索しましたら、
以下の記事を見つけまして
http://hpcgi1.nifty.com/MADIA/VBBBS2/wwwlng.cgi?print+200503/05030106.txt

下のように修正したところ、
構造体に入れることができました。



構造体
---------------------------------------------------------
<StructLayout(LayoutKind.Sequential, Pack:=1)> _
Public Structure bn_file
Public aa As Integer
Public bb As Integer
Public cc As Integer
<VBFixedString(4), System.Runtime.InteropServices.MarshalAs _
(System.Runtime.InteropServices.UnmanagedType.ByValTStr, _
SizeConst:=4)> Public dd As String
End Structure

<StructLayout(LayoutKind.Sequential, Pack:=1)> _
Public Structure bn_data
<VBFixedArray(9), MarshalAs(UnmanagedType.ByValArray, SizeConst:=10)> _
Dim bn_wrk() As bn_file
Public Sub Initialize()
ReDim bn_wrk(9)
End Sub
End Structure

読み込み部分
---------------------------------------------------------
Dim bn_buf As bn_data
Dim fileNm As String
fileNm = 読み込むバイナリデータファイル名
Dim btBuf As Byte() = My.Computer.FileSystem.ReadAllBytes(fileNm)

Dim bn_P As System.IntPtr = Marshal.AllocHGlobal(Marshal.SizeOf(GetType(bn_data)))
Marshal.Copy(btBuf, 0, bn_P, btBuf.Length)
bn_buf = DirectCast(Marshal.PtrToStructure(bn_P, GetType(bn_data)), bn_data)
System.Runtime.InteropServices.Marshal.FreeHGlobal(bn_P)

自分の調査不足でご迷惑をお掛けし、
申し訳ありませんでした。

まだまだ力不足ゆえに
また質問をあげることがあるかもしれませんが、
その際はお力添え頂けると幸いです。

■No28154に返信(shuさんの記事)
> ■No28151に返信(のんさんの記事)
>
>>Public dd As String
> がエラーの原因になっているかと思います。
>
> BinaryReaderで1個づつ読むのは駄目ですか?
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板