C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: Vb6のバイナリファイルをVB.netで読み込み


(過去ログ 110 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■65520 / inTopicNo.1)  Vb6のバイナリファイルをVB.netで読み込み
  
□投稿者/ クロ (1回)-(2013/03/05(Tue) 15:59:06)

分類:[VB.NET/VB2005 以降] 

2013/03/05(Tue) 16:07:15 編集(投稿者)

VB6で以下のように作成された構造体をを1レコードとして保存しているバイナリファイルを
読み込もうとしているのですがCC、DD、EEについてうまく読み込めず困っています。

VB6側では
Type Data
AA as byte
BB as Long
CC as Currency
DD as As String * 4 '半角4文字
EE As String * 30 '全角15文字
End Type
という構造体です。


VB2010側では以下のように読み込もうとしています。

'**********モジュール******************
Public Data As Structure_Data

Public Structure Structure_Data
Dim AA As Byte
Dim BB As Integer
Dim CC As Decimal
<VBFixedStringAttribute(4)>Dim DD As String
<VBFixedStringAttribute(30)>Dim EE As String
End Structure



'**********フォーム内処理**************
Private Sub DataRead()
Dim i,RecCount As Integer
Dim DataFile As New System.IO.BinaryReader(New System.IO.FileStream([ファイルパス], IO.FileMode.Open))
RecCount = CInt(FileLen([ファイルパス]) \ 45 - 1) 'レコード数取得

For i = 0 To RecCount - 1
Struct_Data.AA = DataFile.ReadByte
Struct_Data.BB = DataFile.ReadInt32
Struct_Data.CC = DataFile.CDec(br2.ReadDouble) '←これでは[Decimal 型の値が大きすぎるか、または小さすぎます。]エラーになりました
Struct_Data.DD = DataFile.ReadString    '←うまく取得できませんでした
Struct_Data.EE = DataFile.ReadString
Next

DataFile.Close()
End Sub
アドバイスをお願いします。


引用返信 編集キー/
■65521 / inTopicNo.2)  Re[1]: Vb6のバイナリファイルをVB.netで読み込み
□投稿者/ shu (212回)-(2013/03/05(Tue) 16:32:05)
No65520 (クロ さん) に返信

Currencyは内部表現が8byte整数なのでInt64で読んでみてはどうでしょう?
String*30は30byteのByte配列で読込んでEncodingされた方がよいかと思います。
引用返信 編集キー/
■65524 / inTopicNo.3)  Re[2]: Vb6のバイナリファイルをVB.netで読み込み
□投稿者/ クロ (2回)-(2013/03/05(Tue) 17:40:30)
No65521 (shu さん) に返信
> ■No65520 (クロ さん) に返信
>
> Currencyは内部表現が8byte整数なのでInt64で読んでみてはどうでしょう?
> String*30は30byteのByte配列で読込んでEncodingされた方がよいかと思います。
Currencyは10000倍されているのですね。
一旦ReadInt64で読み込むことでうまくできました。
Byte配列については引き続きやってみます・・・
引用返信 編集キー/
■65525 / inTopicNo.4)  Re[3]: Vb6のバイナリファイルをVB.netで読み込み
□投稿者/ howling (221回)-(2013/03/05(Tue) 19:30:16)
No65524 (クロ さん) に返信
偶然?うまくやれているので問題無いのですが、
構造体をC++側と扱う時は、4バイト境界があるため、4バイトずつの物で入れていった方が良いですよ。
最後の全角15文字は30バイトなのでこの制限を受けますが、
最後なので4バイト境界で全体のサイズ自体は変わってしまうものの、ズレ自体は起きてません。

C++側で同じ構造体を取り扱う場合に、sizeof(構造体名)とかやる場合にはご注意を。
引用返信 編集キー/
■65530 / inTopicNo.5)  Re[4]: Vb6のバイナリファイルをVB.netで読み込み
□投稿者/ shu (213回)-(2013/03/06(Wed) 07:33:28)
No65525 (howling さん) に返信
> ■No65524 (クロ さん) に返信
> 偶然?うまくやれているので問題無いのですが、
> 構造体をC++側と扱う時は、4バイト境界があるため、4バイトずつの物で入れていった方が良いですよ。
> 最後の全角15文字は30バイトなのでこの制限を受けますが、
> 最後なので4バイト境界で全体のサイズ自体は変わってしまうものの、ズレ自体は起きてません。
>
> C++側で同じ構造体を取り扱う場合に、sizeof(構造体名)とかやる場合にはご注意を。
このスレはC++は関係ないきがします。
引用返信 編集キー/
■65542 / inTopicNo.6)  Re[5]: Vb6のバイナリファイルをVB.netで読み込み
□投稿者/ クロ (3回)-(2013/03/06(Wed) 13:16:18)
2013/03/06(Wed) 13:16:46 編集(投稿者)

ソースからの一部抜粋になりますが
Dim bytesData1(3) As Byte
For j = 0 To 3
bytesData1(j) = DataFile.ReadByte
Next
Struct_Data.DD(i) = System.Text.Encoding.GetEncoding(932).GetString(bytesData1)

という感じでバイト配列を使うことでうまくいきました。
大変助かりましたありがとうございます。


解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -