• ベストアンサー

バイナリファイル

VBでバイナリファイルを読み込み、処理しようとしているのですが、VBではバイナリファイルを扱えないのでしょうか? APIしかないのでしょうか? 例) バイナリデータ:10(16進) 取扱データ:16(10進) 上記のことをしたいのですが、うまく扱えません。 CDecも"&H10"なら16として扱えるのですが、バイナリデータをそのまま数値化することができません。 何か良い方法があれば教えて下さい。

  • fcs
  • お礼率22% (2/9)

質問者が選んだベストアンサー

  • ベストアンサー
  • ponnta
  • ベストアンサー率17% (31/179)
回答No.8

ANO.#4の補足についてのコメントです。 >実際にファイルから取得したデータで上記のような処理を行おうとすると >『型が一致しません』と実行時エラーが出てしまいます。 バイナリファイルは基本的に’数値’のデータですので読み込んだあとはそのまま数値として扱えます。 ファイルからInteger型の変数に読み込んでいるならそのままCLngしてみてはいかがでしょうか? ファイルからどのようにデータを読み込んでいるのか判らないので正しいことはいえませんが・・・・

fcs
質問者

お礼

ありがとうございます。 根本的な間違いをしておりました。 数値型で読み込まず、文字列に読み込んでいたためうまくバイナリデータが取得できていませんでした。

その他の回答 (7)

  • arata
  • ベストアンサー率49% (139/279)
回答No.7

2バイトのIntegerであれば、下記のようにBinaryで読み込めば、OKだと思います。この例の場合ファイル上は、 02010100 となります。これは、Intelの場合、上位と下位をひっくり返して持つためで、これで正常なのです。 'データを作成 Private Sub Command1_Click() Dim a As Integer Dim b As Integer Open "c:\bintest.dat" For Binary Access Write As #1 a = 258 b = 1 Put #1, , a Put #1, , b Close #1 End Sub 'データを読込 Private Sub Command2_Click() Dim a As Integer Dim b As Integer Open "c:\bintest.dat" For Binary Access Read As #1 Get #1, , a Get #1, , b Close #1 MsgBox a MsgBox b End Sub このようなデータの持ち方ではなくデータが 02010100 であれば、513と256になって欲しいのであれば、下記のようにBYTE型で1バイトずつ読んでやればokだと思います。なお、上記のようにIntegerで読んだ場合は、マイナス値になることもありますので、ご注意ください。 Private Sub Command3_Click() Dim x(2) As Byte Dim y(2) As Byte Open "c:\bintest.dat" For Binary Access Read As #1 Get #1, , x(1) Get #1, , x(2) Get #1, , y(1) Get #1, , y(2) Close #1 MsgBox x(1) * 256 + x(2) MsgBox y(1) * 256 + y(2) End Sub

  • osaosa42
  • ベストアンサー率60% (20/33)
回答No.6

こゆことじゃないんですか? -------------------------------- 変換例 Dim str16 as String '16進文字列 Dim n as Integer '求める10進数 str16="03E3" n=Val("&H" + str16 + "H") -------------------------------- 意味が違っていたらすんません。 じゃ、そゆことで。

  • KojiS
  • ベストアンサー率46% (145/312)
回答No.5

2バイトデータだと決まっているなら、1バイト毎に取り出して、上位バイトを×256して足せば大丈夫です。 数値の扱われ方(Integerや Long)を注意しましょう。

  • don_cha
  • ベストアンサー率34% (139/407)
回答No.4

補足された内容からすると、バイナリデータを扱うのではなく、テキストデータを16進値として扱いたいということですね。 そうなると、テキストでかかれた「10」をいきなり16進数値の10として扱うことはAPIでも出来ませんね。 質問にも書かれているとおり、一旦テキストデータとして読込み、"&h"を頭につけて数値変換する必要があります。

fcs
質問者

補足

申し訳ありません。補足が間違っておりました。 データファイルはバイナリファイルです。 質問がアバウトすぎてみなさんに伝わらなかったようなので、詳細を記載します。 先ほどは、16と10とわかりにくかった為、例を変えます。 例)2バイトデータ バイナリデータ:03E3(16進) 希望変換後データ:995(10進) デバッグウィンドウなどでは、 clng("&H" & "3E3") このようにすれば、995と取得できるのですが、"3E3"が文字データか、バイナリデータの違いと思うのですが、実際にファイルから取得したデータで上記のような処理を行おうとすると『型が一致しません』と実行時エラーが出てしまいます。 何度もすみませんが、よろしくお願いします。

  • yanmaa
  • ベストアンサー率45% (207/457)
回答No.3

こういうのはいかが? Dim fp As Integer Dim dw As String * 1 Dim ans As Integer fp = FreeFile Open "d:\temp\abc" For Binary Access Read Lock Read Write As fp Len = 1 ファイルENDまで繰り返す。 Get fp, , dw ans = Asc(dw) ここまで Close fp 関数の意味は自分で調べてね。

  • don_cha
  • ベストアンサー率34% (139/407)
回答No.2

例であげられている内容を確認したいのですが、 ファイル内にテキストで「10」と入っているデータを読み込み、アプリケーション内で16進の10(10進の16)として扱いたいということでしょうか?

fcs
質問者

補足

上記でdon_chaさんが言われている通りです。

  • KojiS
  • ベストアンサー率46% (145/312)
回答No.1

バイナリデータの「10」は、1と0が1バイトずつ入っているのでしょうか?それとも、10で1バイト入っているのでしょうか?それによって処理も変わるでしょう。 Open でバイナリーモードで開いて Getすればバイナリーデータを取得できます。それを1バイトずつ取り出してそのまま数値として扱うか、文字列に変換して処理すれば扱えます。 詳しくはヘルプを参照してください。

関連するQ&A

  • バイナリデータの取り方

    VB6を使用して、バイナリファイルをバイナリデータとして文字列にとりたいのですが、全角文字が絡んだ時の処理がうまくいきません。 バイナリファイルをString型の変数に丸ごと読み込んで、後は何バイトから何バイト目を抜き取り数値に変換…という処理をしようとしています。 本来は、バイナリでファイルをオープンして、Getコマンドで取得するのが手っ取り早いのですが、ファイルアクセス回数を減らすため、このような面倒な方法をとっております。 そこで仮に、 dim test as string dim i as integer test = "aあ" & chr(1) & "0 " For i = 1 to 6 Debug.Print Asc(Strconv( _ MidB(Strconv(test,vbFromUnicode),i,1), _ vbUnicode)) Next のようなソースを作ってみました。(本来は文字列は数100KByte…) しかしながら、この方法ですと上の例では2Byte目、つまり「あ」の文字の1Byte目が「&H00」になってしまいます。その次は「&HA0」、他の箇所も問題ないのですが… おそらくは根本的に違う方法で解決すべきではないかと思うのですがその方法がわかりません。 なお、この格納データはバイナリデータなので、意図的に全角文字にしていくてもその値によって(偶然)全角文字になったり制御文字になったりしますので前もって全角文字に対する処理は難しいと考えてます。 質問の仕方が良くなく、質問の内容がなかなかご理解いただけないとは思いますが、ご存知の方、ご経験者の方、ご教授お願いいたします。

  • VB バイナリファイル判定

    掲題通りです。 VBを用いて任意のファイルの対し、処理を行う際、 そのファイルがバイナリかアスキーか判定したいです。 何か効率のよい方法はないでしょうか。

  • RS232Cでバイナリーデータを送信する方法を教えてください。

    VBの初心者です。 RS232Cでバイナリーデータを送信したくVBでAPIを使いプログラムを組みたいと思っております。 色々な本を探してASCIIデータを送信するプログラムは発見し、改造を試みているのですが、WriteFile()ではどうしても&H81や&HF0と言ったデータが&H00に化けてしまいうまく送れません。 どなたか参考になる情報があれば教えて下さい。 よろしくお願い致します。

  • テキストファイルのデータからバイナリを作りたい

    現在、テキストデータとしてCSVファイル1つあたり8バイトのデータが1000個ほどのデータが書かれているファイルがあります。このデータをバイナリファイルへ数値も変換して行きたいと思っています。 たとえば1個目のデータ”12345678”というテキストデータをバイナリの"12345678"に変換したらそれを0x00番地に並べて、そして2個目のデータ”87654321”というデータをバイナリにしたらそれを0x90離れた場所に置いていき、それを1000回繰り返して、結果をバイナリファイルで出力したいのですが、何か簡単にできるフリーソフトなどありませんでしょうか? また、プログラムとかでも簡単にできるのならそうしたいのですが、どうしたらよいか教えていただけないでしょうか?

  • バイナリファイルの特定のバイナリ値をカウントする方法は?

    お世話になります。 質問です。 バイナリファイルから特定のバイナリ値を抽出して、 1バイト単位でカウントする方法はありますか? (例) バイナリファイル"FileA"のバイナリ値0xffをカウントする。 <FileAの中身> 0xfe 0xff 0xff 0x12 0x00 0x00 0xff 0x01 0x00 ↑のファイルから0xffを3カウントした。 $ hexdump -v <ファイル> | grep <ターゲットの値> | wc -w (質問を書いてる現在、linux環境が無いので記憶を頼りに書いてますので間違ってると思います) ↑のようにのような方法は思いつきましたが 「一度テキストにして~grepにパイプして~wcにパイプする」となると、 ファイルサイズに依っては処理に数時間費やしてしまいます。 なので、以下の条件を満たす方法を探しています。 (1)処理の無駄が少ない(バイナリを直接探す方法等) (2)できるだけシンプルにコマンドライン一行で実現 (3)スクリプトファイルを含むソースファイルを作る作業無し よろしくお願いします。

  • バイナリファイルについて

    DataForkerというバイナリエディタで、MIDIのデータを書いたのですが 保存のしかたがよくわかりません。そのまま、適当にファイル名付けて、 .midと拡張子付けただけでは、これはMIDIファイルとして認識されないんでしょうか?

    • ベストアンサー
    • Mac
  • バイナリファイルなのですが・・・。

    研究用のデータを受け取ったのですが、テキストではなくバイナリファイルでもらいました。データを取得した人によると、↓にある装置を使って時系列データをintel86系バイナリフォーマットで記録したと言っていました。 http://www.sonysms.co.jp/j/products/datarecorder/pdf/SONY_PCscan3_jp.pdf どうにかしてこのバイナリファイルをテキストに変換して、データを取得したいのですが、どうしたらよいのでしょうか? ネットにあるバイナリ→テキスト変換ツールを使いましたが、16進数の数字が羅列されるだけで、エクセルなどで読めるデータ形式にはなりませんでした。

  • バイナリ

    VB6.0を使っています。 全てのファイル(Word、エクセル、Exe、Txtなどなんでも)はバイナリファイルとして扱えるのですか? バイナリファイルとして読み込んで、別名で保存して、 また、元の形式に戻すにはどのようにしたらよいのでしょうか? バイナリモードでOpenして 1バイトずつ、 バイナリモードで書き込めばいいのでしょうか? また、読む場合は、 バイナリモードで開いて、 1文字ずつ 何モードで書き込めばいいのでしょう? バイナリでいいのですか? ファイルの形式などよくわかっていません。。。。

  • バイナリファイルの書き出し

    バイナリファイルにデータを書き込むプログラムを作りたいと思っています。実は、Standard MIDI Fileのバイナリファイルを作りたいんです。 SMFについては、今まで、直接バイナリエディタで開き、16進数の数字をいじくって、データ書き換えたりしてたので直接バイナリファイルに16進数での数字を書きたいんです。 たとえば、テキストファイルに903C408360803C0000みたいに吐き出すプログラムでは、バイナリファイルに書き出してからバイナリエディタで開くと こいつがさらに16進数に変換されてしまいますよね? そうならないようにするにはどうやればいいんですか?

  • VBScriptでバイナリファイルアクセス

    VisualBasicScriptでファイルにバイナリデータを書き込むなどの、 バイナリアクセスをすることはできるのでしょうか。 もしできるのなら、方法を教えてください。

専門家に質問してみよう