質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

5回答

908閲覧

VBで作成したバイナリファイル構造について

BluePi85

総合スコア22

VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2018/03/08 13:08

編集2018/03/08 13:11

VBで作成した以下のバイナリファイルで、
ファイル構造から何Byte目に、どのデータが格納されているか
確認を行いたい。

文字列が可変長なため、
どのようにアプローチしたら良いか分からず
苦戦しております。

良きアドバイスを頂けないでしょうか?

該当のソースコード

VB6

Dim temp(5) As String
Dim int_value As Integer
Dim double_vale As Double

' 値の設定
temp(0) = "Hello World"
temp(1) = ""
temp(2) = "test"
temp(3) = "Windows10 Professional"
temp(4) = "Japan"

int_value = 3
double_vale = 123.456789

' バイナリファイル出力
Open "C:\test.dat"For Binary As 1
Put 1, , int_value
Put 1, , temp
Put 1, , double_vale
Close #1

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

ベストアンサー

バイナリエディタで読めという回答にマイナスがついていますが、私は全く的外れな回答とは思っていません。

VB6 ということですが、VBA でも全く同じ関数があるのでやってみました。
おそらく互換性があると思います。
できたものをダンプしたのが次です。

03 00 0B 00 48 65 6C 6C 6F 20 57 6F 72 6C 64 00 00 04 00 74 65 73 74 16 00 57 69 6E 64 6F 77 73 31 30 20 50 72 6F 66 65 73 73 69 6F 6E 61 6C 05 00 4A 61 70 61 6E 00 00 0B 0B EE 07 3C DD 5E 40

最初の 2 バイト 03 00 は 16 ビットリトルエンディアンで 3 のことです。
最初に 3 を書き込んでいるので合致します。

次の 2 バイト 0B 00 は同じく 16 ビットリトルエンディアンで 11 です。
整数値は 16 ビットリトルエンディアンで書き込んでいると思えばいいようです。
この 11 というのは「Hello World」の文字数です。
次に続く 48 65 6C 6C 6F 20 57 6F 72 6C 64Hello World を ASCII コードで表したものです。
つまり可変長文字列を書き込む場合にはまず文字数を書き込んでから文字列本体を書き込むようです。

続く 00 00 は空文字の文字数です。

その次の 04 00 は 4 です。test の文字数です。

このように、書き込まれたものを読んでいけば法則がわかります。
恐らく互換性があるとは思いますがその保証はないので、VB6 で実際に作ったものを同様に読んでください。

投稿2018/03/09 01:36

編集2018/03/09 01:47
Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

もしも32bitのパソコンがあれば、コマンドプロンプトからdebugコマンドを使って簡単にバイナリダンプを見ることができます。
バイナリファイルのファイル名がXXX.txtだったとしたら、コマンドプロンプトから
DEBUG XXX.txt
と入力します。すると"-"が表示されコマンド待ちの状態になりますので、
d100
と入力するとそのままバイナリダンプを見ることができます。
なお、終了する場合には、"-"が表示されている状態からquitと入力します。

投稿2018/03/08 14:41

diracpaul

総合スコア157

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

出力されたファイルをバイナリエディタで見ればいいと思います。

投稿2018/03/08 13:38

unz.hori

総合スコア1057

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

リファレンスマニュアルのPutの説明に記載されているのでご確認下さい。
WEB上だと下記のURLで閲覧出来ます。
https://msdn.microsoft.com/en-us/library/aa266212(v=vs.60).aspx

VB6.0が保存したデータを読み込むツールを別の言語で作ろうとしているなら、素直にVB6.0でテキスト形式に変換して出力するような、データ変換プログラムを作成することをお勧めします。VB6.0の文字列型やVariant型、配列の取り扱いは特殊です。今からでは資料も手に入り難く、今からVB6.0の低レベルの挙動を学習するぐらいなら、VB6の簡単なプログラムを作成を学習して、変換プログラムを組むほうがよいと思います

投稿2018/03/08 15:06

Kunihiro_Narita

総合スコア472

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2018/03/09 02:48

ななめ読みして見落としていました。確かに書いてありますね。 If the variable being written is a variable-length string, Put writes a 2-byte descriptor containing the string length and then the variable. The record length specified by the Len clause in the Open statement must be at least 2 bytes greater than the actual length of the string. 変換プログラムを組むほうがよいかどうかは質問者さんのやりたいことと合致しているかどうかわかりませんが、Variant についての記述もあるので非常に有益な情報だと思います。
guest

0

そもそもの一般論として、可変長のバイナリファイルなら、可変部分のデータ数などを格納しなければ、どの言語でも読み込めないと思います。
コードで言うと、tempの文字数をint_valueのあとに書き込む必要があるということ。
よって現状のフォーマットでは厳しいんじゃないかと思います。

追記
Zuishinさんの調査結果で、文字数も書き込まれているとのことでした。
なので、本回答はスルーしてください。

投稿2018/03/08 23:44

編集2018/03/09 01:42
ttyp03

総合スコア16998

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問