VBでバイナリデータをテキストデータに変換するには?

解決


HG  2005-09-10 00:50:59  No: 92183

バイナリファイルを読み込んで、それを2バイトずつに区切って、
テキストデータに変換し、セルに書き込んでいくにはどうすればよいですか?


KG  2005-09-10 00:59:52  No: 92184

2バイトずつに区切って読み込むだけでいいなら、それはバイナリファイルでは
なくてテキストデータなのでは、、、、

それとも文字コード(16進数)に変換したいのでしょうか?


HG  2005-09-10 01:07:24  No: 92185

例えば、82A082A2  というバイナリデータがあったとしたら、
82A0  で区切って「あ」、
82A2  で区切って「い」という風に変換して、
それぞれ、別々のセルに書込みしたいのです。
でも、データを82A0という風に指定しないで、
どんなバイナリデータが入ってるかわかんないファイルを読み込んで、
変換できるようにしたいのですが・・・

意味わかりにくかったらごめんなさい・・・orz
お願いします。


Blue  2005-09-10 01:10:36  No: 92186

> バイナリファイルを読み込んで、それを2バイトずつに区切って、
これってUnicodeが前提なのでは?

2バイトずつかどうかは、1バイト目を見てから決めなきゃいけないような。。。


HG  2005-09-10 01:14:23  No: 92187

そうなんですか〜。
ホント、初心者なもんで、すみません・・・↓↓

では、1バイト目を見て決める方法って、何かありますかね??


Blue  2005-09-10 01:18:21  No: 92188

> どんなバイナリデータが入ってるかわかんないファイルを読み込んで、
> 変換できるようにしたいのですが・・・
というか、どのように変換するかなのではないでしょうか?
Unicodeとして変換するのかSJISとして変換するのか決めなければ。
(変換後、Unicodeとしてコードがなければ、どのように表示するのか等)


HG  2005-09-10 01:23:21  No: 92189

すみません、UnicodeとSJISの違いが分からないのですが(>_<)


シロクロ  2005-09-10 03:19:14  No: 92190

>すみません、UnicodeとSJISの違いが分からないのですが(>_<)

せめてUnicode、SJISについて自分で調べて
どこが分からないのかぐらいは提示すべきです。

回答する方もどこから、どこまで回答すればよいのか
困ります。


魔界の仮面弁士  2005-09-10 03:52:50  No: 92191

えーと。どこから説明したものやら。

まず、Shift_JIS(SJIS)ですが、これはBlueさんが書かれたように、
データの先頭から調べなければなりません。

Shift_JISという形式は、「1バイトで構成される文字」と「2バイトで
構成される文字」が混在しています。しかも、文字によっては
    『=』  →  81 81
    『≠』  →  81 82
    『a』  →  82 81
    『b』  →  82 82
のようになっているため、データの内容だけ見ても、文字として
どこで切り出すべきかは判定できません。

そのため、バイナリの先頭から順に取り出して、それぞれが
「1バイト文字」なのか「2バイト文字の1バイト目」なのか
「2バイト文字の2バイト目」なのかを判定していくしかありません。

一方、Unicodeですが……実は、これには幾つかの種類がありますが、
有名なのは、UTF-8 と UTF-16 なので、この2つについて見てみましょうか。
(細かい事を言えば、UTF-16にも、さらに数種類の形式があったりしますが)

UTF-16 の場合、全ての文字が「2バイト単位」で構成されていますので、
単純に2バイト単位で区切っていく事で、文字単位に取り出す事が可能です。
しかし、(バイト位置ではなく)バイナリ内容を見るだけでは、
文字の区切り位置を判定することはできません。たとえば、
    『†』  →  20 20
のように、1バイト目と2バイト目が同じバイナリになる事があるからです。

UTF-8 の場合は、文字によってバイト長が異なる形式です。
そのため、バイト位置を見ただけでは、文字として切り出す事ができません。
その代わりに、(バイト位置ではなく)バイナリ内容を見るだけで、
文字の区切り位置を判定する事ができるようになっています。
2進数で表現した時に、「0xxxxxxx」のように、ビットの先頭が0に
なっていれば、それは『1バイトのみで構成される文字』です。
2進数で「110xxxxx」の形式なら、『2バイト文字の1バイト目』です。
2進数で「1110xxxx」の形式なら、『3バイト文字の1バイト目』です。
2進数で「11110xxx」の形式なら、『4バイト文字の1バイト目』です。
2進数で「10xxxxxx」の形式になっていれば、『複数バイトで
構成される文字の、1バイト目以外(つまり2バイト目以降)』となります。


あとは  2005-09-10 04:08:40  No: 92192

ビックエンディアンとかリトルエンディアンとかも考慮すると・・・。


魔界の仮面弁士  2005-09-10 06:18:45  No: 92193

とりあえず、バイナリをテキスト変換したいなら、
文字コードを把握しておく必要がありますね。

文字コードが不明なデータの場合、バイナリの内容を見ただけでは、
元の文字コードを正しく判断する事はできない可能性がありますから。
(完全なる判定ではなく、「推測」程度ならば出来るでしょうけれども)

> 82A0  で区切って「あ」、
> 82A2  で区切って「い」という風に変換して、

たとえば 82 A0 82 A2 は、Shift_JIS としてみれば『あ』『い』の
2文字ですが、UTF-16BE として見た場合には、『くさかんむり + 文』
『くさかむり + 仁』という日本には無い漢字2文字を表している事に
なってしまいます。UTF-16LE として見た場合は、『YI SYLLABLE NBOX』
『YI SYLLABLE WA』という"イ音節文字"を表していることになります。

ただ逆に、文字コードが事前にわかっているのであれば、
テキストへの変換はさほど難しい作業ではありません。

VB.NET ならば、System.Text.Encoding クラスが使えますし、
VB6 や VBScript ならば、ADODB.Stream を使う事で
文字コード変換が可能となりますので。

たとえば、ADODB.Stream を使った方法の場合は、
  With CreateObject("ADODB.Stream")
    .Charset = "Shift_JIS"   'ここに文字コードを指定。
    .Open
    .LoadFromFile "C:\TEST.BIN"
    MsgBox .ReadText()
    .Close
  End With
のように書く事で、「C:\TEST.BIN」の中身を、文字列として読み込めます。

# なお、『.Charset = "_autodetect"』にすれば、文字コードの自動判定が
# 行われます。内容によっては、正しく判断できるとは限りませんけれども。


HG  2005-09-13 01:47:42  No: 92194

みなさん、ありがとうございます!!
参考にさせていただきます。
もう少し勉強してからまた来ます。


  2005-11-04 22:39:59  No: 92195

おかげさまで解決できました。
ありがとうございます。


HG  2005-11-04 22:40:34  No: 92196

↑の、名前間違えました・・・HGです。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加