-PR-
解決
済み

バイナリファイル

  • すぐに回答を!
  • 質問No.67675
  • 閲覧数1230
  • ありがとう数6
  • 気になる数0
  • 回答数8
  • コメント数0

お礼率 22% (2/9)

VBでバイナリファイルを読み込み、処理しようとしているのですが、VBではバイナリファイルを扱えないのでしょうか?
APIしかないのでしょうか?

例)
バイナリデータ:10(16進)
取扱データ:16(10進)

上記のことをしたいのですが、うまく扱えません。
CDecも"&H10"なら16として扱えるのですが、バイナリデータをそのまま数値化することができません。
何か良い方法があれば教えて下さい。
通報する
  • 回答数8
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

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

  • 回答No.8
レベル10

ベストアンサー率 17% (31/179)

ANO.#4の補足についてのコメントです。

>実際にファイルから取得したデータで上記のような処理を行おうとすると
>『型が一致しません』と実行時エラーが出てしまいます。

バイナリファイルは基本的に’数値’のデータですので読み込んだあとはそのまま数値として扱えます。
ファイルからInteger型の変数に読み込んでいるならそのままCLngしてみてはいかがでしょうか?

ファイルからどのようにデータを読み込んでいるのか判らないので正しいことはいえませんが・・・・
お礼コメント
fcs

お礼率 22% (2/9)

ありがとうございます。
根本的な間違いをしておりました。
数値型で読み込まず、文字列に読み込んでいたためうまくバイナリデータが取得できていませんでした。
投稿日時 - 2001-04-25 21:14:46
-PR-
-PR-

その他の回答 (全7件)

  • 回答No.2
レベル11

ベストアンサー率 34% (139/407)

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

ファイル内にテキストで「10」と入っているデータを読み込み、アプリケーション内で16進の10(10進の16)として扱いたいということでしょうか?
補足コメント
fcs

お礼率 22% (2/9)

上記でdon_chaさんが言われている通りです。
投稿日時 - 2001-04-24 16:08:46


  • 回答No.1
レベル11

ベストアンサー率 46% (145/312)

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

Open でバイナリーモードで開いて Getすればバイナリーデータを取得できます。それを1バイトずつ取り出してそのまま数値として扱うか、文字列に変換して処理すれば扱えます。

詳しくはヘルプを参照してください。
  • 回答No.3
レベル12

ベストアンサー率 45% (207/457)

こういうのはいかが? 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 Writ ...続きを読む
こういうのはいかが?
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

関数の意味は自分で調べてね。
  • 回答No.4
レベル11

ベストアンサー率 34% (139/407)

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

そうなると、テキストでかかれた「10」をいきなり16進数値の10として扱うことはAPIでも出来ませんね。

質問にも書かれているとおり、一旦テキストデータとして読込み、"&h"を頭につけて数値変換する必要があります。
補足コメント
fcs

お礼率 22% (2/9)

申し訳ありません。補足が間違っておりました。
データファイルはバイナリファイルです。
質問がアバウトすぎてみなさんに伝わらなかったようなので、詳細を記載します。

先ほどは、16と10とわかりにくかった為、例を変えます。
例)2バイトデータ
バイナリデータ:03E3(16進)
希望変換後データ:995(10進)

デバッグウィンドウなどでは、
clng("&H" & "3E3")
このようにすれば、995と取得できるのですが、"3E3"が文字データか、バイナリデータの違いと思うのですが、実際にファイルから取得したデータで上記のような処理を行おうとすると『型が一致しません』と実行時エラーが出てしまいます。
何度もすみませんが、よろしくお願いします。
投稿日時 - 2001-04-24 16:39:07
  • 回答No.6
レベル8

ベストアンサー率 60% (20/33)

こゆことじゃないんですか? -------------------------------- 変換例 Dim str16 as String '16進文字列 Dim n as Integer '求める10進数 str16="03E3" n=Val("&H" + str16 + "H") - ...続きを読む
こゆことじゃないんですか?
--------------------------------
変換例
Dim str16 as String '16進文字列
Dim n as Integer '求める10進数

str16="03E3"
n=Val("&H" + str16 + "H")
--------------------------------
意味が違っていたらすんません。
じゃ、そゆことで。
  • 回答No.5
レベル11

ベストアンサー率 46% (145/312)

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

ベストアンサー率 49% (139/279)

2バイトのIntegerであれば、下記のようにBinaryで読み込めば、OKだと思います。この例の場合ファイル上は、 02010100 となります。これは、Intelの場合、上位と下位をひっくり返して持つためで、これで正常なのです。 'データを作成 Private Sub Command1_Click() Dim a As Integer Dim b As ...続きを読む
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
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ