|
▼kein さん:
>私がやりたいのはIEEE形式倍精度浮動小数点フォーマット(以下、IEEE)で
>記録されているバイナリファイルを読み込んで10進数表記のテキストに
>変換するということです。
なるほど・・・。
では、こんなコードを実行して試してみてください。
新規ブックの標準モジュールにて、
Sub バイナリファイルの作成()
Dim dbl(1 To 3) As Double
Dim fno As Long
dbl(1) = 0.111
dbl(2) = 3
dbl(3) = 4
'書き込むデータは上記の配列です
fno = FreeFile
Open ThisWorkbook.Path & "\sample.bin" For Binary As #fno
Put #1, , dbl()
Close #fno
End Sub
ThisWorkbook.Path を使っていますから、名前を付けて保存してから、
上記のコードを実行してください。
ブックと同じフォルダ上に sample.binというファイルが作成されます。
バイナリエディタを使えば、中身をHEXイメージで見ることが出来ますから、
見てみてください。
ファイルのプロパティを見れば、サイズが24バイトと表示されているはずです。
当然ですよね?
倍精度浮動小数点データを3つ書き込んでいますから、
3*8=24バイトですね!!
バイナリエディタで中身をみると、以下のようなHEXイメージが表示されます。
D1 22 DB F9 7E 6A BC 3F 00 00 00 00 00 00 08 40
00 00 00 00 00 00 10 40
いかがですか? 想像したような値ですか?
最初の8バイト(D1 22 DB F9 7E 6A BC 3F)で0.111 という数字を表していることに
なるのですが、最初のハーフバイトは、Dです。2進数では、1101ですね?
>1ビット目が符号
と仰っていましたが、1ですね? 0.111は、正の数なのに・・・。
実は、ディスク上では、逆に記録されているので本当は、
3F BC 6A 7E F9 DB 22 D1 なんです。
これが、0.111なんです。
ですから、Byte変数で読み込んだ場合は、そのまま、
D1 22 DB F9 7E 6A BC 3F の順序で読み込んでしまいますから、
その辺りも考慮しなければなりません。
が、倍精度浮動小数点のデータだけだと分かっているなら・・・、
Sub バイナリファイルの読み込み()
Dim g0 As Long
Dim dbl() As Double
Dim fno As Long
fno = FreeFile
Open ThisWorkbook.Path & "\sample.bin" For Binary As #fno
ReDim dbl(1 To LOF(fno) / 8)
Get #1, , dbl()
Close #fno
For g0 = LBound(dbl()) To UBound(dbl())
MsgBox g0 & "番目の数字は、 " & dbl(g0)
Next
MsgBox "終わり"
End Sub
こんなコードで値は、取得できます。
こういうことですか?
|
|