バイナリーファイルから読み込んだデータを構造体にセットするにはどのようにすればよいですか?
ご教授よろしくお願いします。
ファイルサイズは構造体のサイズと同じく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も見ています
-
外出時に「待たせる妻」vs イライラする「待つ夫」は日本だけ?見習いたい海外事情
夫の家事参加に積極的なイメージのある海外でも、同様の事例はあるのか。結婚カウンセラーの佐竹悦子さんに伺ってみた。
-
ファイル入力のデータを構造体に入れる方法
Visual Basic(VBA)
-
VB6.0の「vbFromUnicode」はVB.NETではどれに相当しますか?
Visual Basic(VBA)
-
VBの「As String * 128」とは?
Visual Basic(VBA)
-
-
4
エラー:ストリームの終わりを超えて読み取ることはできません
Visual Basic(VBA)
-
5
VB.NET フォーム上に描いたグラフィックのクリア方法
Visual Basic(VBA)
-
6
VisualBasic6からVB2005に移行に難儀しています。
Visual Basic(VBA)
-
7
文字列の後ろから必要分だけ削除したい。
Visual Basic(VBA)
-
8
VS 2008(VB.NET)
Visual Basic(VBA)
-
9
VB6からVB2010への変換について
Visual Basic(VBA)
-
10
DLL<->VB間での受け渡し(文字列・ポインタ)
Visual Basic(VBA)
-
11
FORMが開いているかどうかの確認方法
Visual Basic(VBA)
-
12
構造体→文字列→構造体 をする方法
Visual Basic(VBA)
-
13
TextFieldParserの固定長桁数をバイト単位で指定したい
Visual Basic(VBA)
-
14
VB.NETでファイル名順にファイルを読む方法
Visual Basic(VBA)
-
15
String"から型'Double'への変換は無効です。 とエラーが出ます。
Visual Basic(VBA)
-
16
構造体をランダムファイルに書き込みたいのですが
Visual Basic(VBA)
-
17
FileOpen 関数で既にファイルが開かれている場合
Visual Basic(VBA)
-
18
VB.NET DataGridView 縦スクロールバーを常に表示
Visual Basic(VBA)
-
19
[VB.net] DataGridViewの列ヘッダー複数行表示に伴う不具合?について
Visual Basic(VBA)
-
20
VB.NETで DataRow()を利用して、値からコードを取得したい。
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBA 変数名に変数を使用したい。
-
vba フィルター 複数条件 3つ以...
-
エクセルでXY座標に並べられた...
-
CheckBoxの配列化
-
Excel2010のinputboxで複数デー...
-
定数配列の書き方
-
VBAでMODE関数をつくる
-
Dir関数で読み取り順を操作でき...
-
VBA ReDim と ReDim Preserve ...
-
VB6のメモリ解放に関して
-
excel vbaの配列なんですが・・・
-
C#でbyte配列から画像を表示さ...
-
複数のtextboxの処理を一括で行...
-
配列のペースト出力結果の書式...
-
構造体配列内の文字列検索のよ...
-
.NET 文字コードの変換
-
VB6からの移行したいけど、VB.N...
-
countif/sumifのようなVBA関数
-
EXCEL VBA 配列デー...
-
テキストボックの文字を一行ず...
マンスリーランキングこのカテゴリの人気マンスリー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の配列化
-
配列の中の最大値とそのインデ...
おすすめ情報