バイナリーファイルから読み込んだデータを構造体にセットするにはどのようにすればよいですか?
ご教授よろしくお願いします。
ファイルサイズは構造体のサイズと同じく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も見ています
-
プロが教えるわが家の防犯対策術!
ホームセキュリティのプロが、家庭の防犯対策を真剣に考える 2組のご夫婦へ実際の防犯対策術をご紹介!どうすれば家と家族を守れるのかを教えます!
-
ファイル入力のデータを構造体に入れる方法
Visual Basic(VBA)
-
VB6.0の「vbFromUnicode」はVB.NETではどれに相当しますか?
Visual Basic(VBA)
-
エラー:ストリームの終わりを超えて読み取ることはできません
Visual Basic(VBA)
-
-
4
VBの「As String * 128」とは?
Visual Basic(VBA)
-
5
VB.NET フォーム上に描いたグラフィックのクリア方法
Visual Basic(VBA)
-
6
VisualBasic6からVB2005に移行に難儀しています。
Visual Basic(VBA)
-
7
文字列の後ろから必要分だけ削除したい。
Visual Basic(VBA)
-
8
VB6からVB2010への変換について
Visual Basic(VBA)
-
9
VS 2008(VB.NET)
Visual Basic(VBA)
-
10
DLL<->VB間での受け渡し(文字列・ポインタ)
Visual Basic(VBA)
-
11
FORMが開いているかどうかの確認方法
Visual Basic(VBA)
-
12
構造体→文字列→構造体 をする方法
Visual Basic(VBA)
-
13
VB.NETでファイル名順にファイルを読む方法
Visual Basic(VBA)
-
14
FileOpen 関数で既にファイルが開かれている場合
Visual Basic(VBA)
-
15
String"から型'Double'への変換は無効です。 とエラーが出ます。
Visual Basic(VBA)
-
16
TextFieldParserの固定長桁数をバイト単位で指定したい
Visual Basic(VBA)
-
17
VB.NET DataGridView 縦スクロールバーを常に表示
Visual Basic(VBA)
-
18
構造体をランダムファイルに書き込みたいのですが
Visual Basic(VBA)
-
19
VB.NETで DataRow()を利用して、値からコードを取得したい。
Visual Basic(VBA)
-
20
[VB.net] DataGridViewの列ヘッダー複数行表示に伴う不具合?について
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBA 変数名に変数を使用したい。
-
コンボボックスのインデックス...
-
エクセルでXY座標に並べられた...
-
C#でbyte配列から画像を表示さ...
-
構造体配列の特定のメンバーをF...
-
配列の要素がすべてカラかどう...
-
配列の中の最大値とそのインデ...
-
Redim とEraseの違いは?
-
Excelマクロ:配列データからグ...
-
C言語 ポインタと配列
-
vba フィルター 複数条件 3つ以...
-
CheckBoxの配列化
-
VBで重複しているデータをユニ...
-
エクセルVBAからNotesでメー...
-
エクセルの列一括書き込み
-
定数配列の書き方
-
エクセル(VBA)の空白配列の削除...
-
DBから取得した値を配列へ代入する
-
配列の中から最大値だけ取り出...
-
pictureboxの名前を変数で設定...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA 変数名に変数を使用したい。
-
Excel2010のinputboxで複数デー...
-
vba フィルター 複数条件 3つ以...
-
C#でbyte配列から画像を表示さ...
-
配列のペースト出力結果の書式...
-
Dir関数で読み取り順を操作でき...
-
エクセルでXY座標に並べられた...
-
VBAで配列引数を値渡しできない...
-
C++で作成したDLLにVBAから配列...
-
構造体配列の特定のメンバーをF...
-
OutOfMemoryExceptionの回避策...
-
大量の変数を定義するにはどう...
-
VBAでMODE関数をつくる
-
VBScriptでCSVファイルを読み出...
-
定数配列の書き方
-
Segmentation Fault (メモリ制限?)
-
Excelのメモリ(配列)の上限は2G...
-
Redim とEraseの違いは?
-
CheckBoxの配列化
-
配列の中の最大値とそのインデ...
おすすめ情報