バイナリーファイルから読み込んだデータを構造体にセットするにはどのようにすればよいですか?
ご教授よろしくお願いします。
ファイルサイズは構造体のサイズと同じく300byteです。
Public Structure ST1
<VBFixedString(10), System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst:=10)> _
Public str1() As String
<VBFixedString(20), System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst:=20)> _
Public str2() As String
<VBFixedString(30), System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst:=30)> _
Public str3() As String
Public Sub Initialize()
ReDim str1(4)
ReDim str2(4)
ReDim str3(4)
End Sub
End Structure
処理
Private Sub btn1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btn1.Click
dim ST as new ST1
ST.Initialize()
FileOpen(1, OpenFileDialog1.FileName, OpenMode.Binary, OpenAccess.Read, OpenShare.Default))
FileGet(1, ST)
FileClose(1)
End Sub
ここでわからないのが、イニシャライズを行い、配列数を設定しても、ファイルから読み込んでくるバイト数は配列でないときと同じサイズ(60byte)で読み込んできてしまいます。
STをイニシャライズしても、Marshal.SizeOf(ST)の値が変わらないのが原因だと思うのですが、宣言の仕方がおかしいのでしょうか?
ご教授お願いいたします。
No.1ベストアンサー
- 回答日時:
マーシャリングを
<VBFIxedArray(4), VBFixedString(10), MarshalAs(UnmanagedType.ByValArray, ArraySubType:=UnmanagedType.ByValTStr, SizeConst:=10)> _
Public str1() As String
といった具合に変更して
構造体の属性に
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Ansi)>
を追加してみてください
構造体のメンバーがVBFixedString属性がついていないと
文字列の長さ(2Byte)+文字列のデータ といった具合のデータ構造を要求します
これによりFileGetで読み込んだ際 Streamの終端を越えてしまうのではないでしょうか
回答ありがとうございます。
早速指摘していただいた変更を実装し実行してみました。
正しく処理を行うことができました。
行き詰っておりましたので本当に助かりました、ありがとうございます。
重ねて申し訳ないのですが、よろしければマーシャリングの宣言について、何か参考になる図書がありましたら、教えていただけないでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) countifsについての質問 3 2023/03/08 13:45
- Visual Basic(VBA) Worksheet_Change 4 2023/03/12 21:54
- Visual Basic(VBA) select caseの入れ子 3 2023/03/08 18:48
- Visual Basic(VBA) VBAで時間(00:00形式)を積算(足し算)したい 1 2022/11/15 17:04
- 英語 文法的解釈を教えてください 1 2023/06/22 10:05
- Visual Basic(VBA) ワークブック内すべて検索 2 2022/12/20 20:13
- Visual Basic(VBA) ワークシートチェンジで曜日を表示する方法 1 2023/03/04 21:51
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る バッチからEXEの結果を受け取りたいのですが、 下記のバッ 1 2023/07/04 15:13
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る EXEの実行内容の結果によって、戻り値を0か1かで返したい 1 2023/07/04 16:40
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
このQ&Aを見た人はこんなQ&Aも見ています
-
「環境が人を育てる」って本当?環境によって人格や生き方は本当に変わるのか
環境が人生に与える影響は実際どれほどのものなのか、専門家の田宮由美さんに伺った。
-
ファイル入力のデータを構造体に入れる方法
Visual Basic(VBA)
-
VB6.0の「vbFromUnicode」はVB.NETではどれに相当しますか?
Visual Basic(VBA)
-
VBの「As String * 128」とは?
Visual Basic(VBA)
-
-
4
VB.NETでファイル名順にファイルを読む方法
Visual Basic(VBA)
-
5
VisualBasic6からVB2005に移行に難儀しています。
Visual Basic(VBA)
-
6
文字列の後ろから必要分だけ削除したい。
Visual Basic(VBA)
-
7
TextFieldParserの固定長桁数をバイト単位で指定したい
Visual Basic(VBA)
-
8
CloseとDisposeの違い
Visual Basic(VBA)
-
9
VS 2008(VB.NET)
Visual Basic(VBA)
-
10
VB6からVB2010への変換について
Visual Basic(VBA)
-
11
VB.NET フォーム上に描いたグラフィックのクリア方法
Visual Basic(VBA)
-
12
FORMが開いているかどうかの確認方法
Visual Basic(VBA)
-
13
構造体→文字列→構造体 をする方法
Visual Basic(VBA)
-
14
FriendとPublicの違い。。。
Visual Basic(VBA)
-
15
String"から型'Double'への変換は無効です。 とエラーが出ます。
Visual Basic(VBA)
-
16
VB.NETにおける構造体の初期化
Visual Basic(VBA)
-
17
他フォームのクリックイベント取得
Visual Basic(VBA)
-
18
エラー:ストリームの終わりを超えて読み取ることはできません
Visual Basic(VBA)
-
19
構造体をランダムファイルに書き込みたいのですが
Visual Basic(VBA)
-
20
VB.net、テキストボックス入力制限、全角のみ
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBA 変数名に変数を使用したい。
-
C#でbyte配列から画像を表示さ...
-
vba フィルター 複数条件 3つ以...
-
定数配列の書き方
-
VBScript で ADO Streamオブジ...
-
Dir関数で読み取り順を操作でき...
-
デバイスマネージャーの一覧取得
-
順位をつける VB.NET2008
-
構造体配列内の文字列検索のよ...
-
2次元配列の初期値
-
エクセル(VBA)の空白配列の削除...
-
構造体配列の特定のメンバーをF...
-
コンボボックスのインデックス...
-
配列の中から最大値だけ取り出...
-
配列の中の最大値とそのインデ...
-
大量の変数を定義するにはどう...
-
Redim とEraseの違いは?
-
VB.NETの配列の限界を教えてく...
-
C++で作成したDLLにVBAから配列...
-
複数のtextboxの処理を一括で行...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA 変数名に変数を使用したい。
-
C#でbyte配列から画像を表示さ...
-
vba フィルター 複数条件 3つ以...
-
Dir関数で読み取り順を操作でき...
-
エクセルでXY座標に並べられた...
-
配列の中の最大値とそのインデ...
-
VB.NETの配列にExcelから読み込...
-
定数配列の書き方
-
Excel2010のinputboxで複数デー...
-
大量の変数を定義するにはどう...
-
構造体配列の特定のメンバーをF...
-
構造体配列内の文字列検索のよ...
-
Redim とEraseの違いは?
-
Segmentation Fault (メモリ制限?)
-
OutOfMemoryExceptionの回避策...
-
VBAでMODE関数をつくる
-
COBOLの基本的な事なので...
-
Excelのメモリ(配列)の上限は2G...
-
コンボボックスのインデックス...
-
VB6のメモリ解放に関して
おすすめ情報