バイナリファイルを読み込んで、それを2バイトずつに区切って、
テキストデータに変換し、セルに書き込んでいくにはどうすればよいですか?
2バイトずつに区切って読み込むだけでいいなら、それはバイナリファイルでは
なくてテキストデータなのでは、、、、
それとも文字コード(16進数)に変換したいのでしょうか?
例えば、82A082A2 というバイナリデータがあったとしたら、
82A0 で区切って「あ」、
82A2 で区切って「い」という風に変換して、
それぞれ、別々のセルに書込みしたいのです。
でも、データを82A0という風に指定しないで、
どんなバイナリデータが入ってるかわかんないファイルを読み込んで、
変換できるようにしたいのですが・・・
意味わかりにくかったらごめんなさい・・・orz
お願いします。
> バイナリファイルを読み込んで、それを2バイトずつに区切って、
これってUnicodeが前提なのでは?
2バイトずつかどうかは、1バイト目を見てから決めなきゃいけないような。。。
そうなんですか〜。
ホント、初心者なもんで、すみません・・・↓↓
では、1バイト目を見て決める方法って、何かありますかね??
> どんなバイナリデータが入ってるかわかんないファイルを読み込んで、
> 変換できるようにしたいのですが・・・
というか、どのように変換するかなのではないでしょうか?
Unicodeとして変換するのかSJISとして変換するのか決めなければ。
(変換後、Unicodeとしてコードがなければ、どのように表示するのか等)
すみません、UnicodeとSJISの違いが分からないのですが(>_<)
>すみません、UnicodeとSJISの違いが分からないのですが(>_<)
せめてUnicode、SJISについて自分で調べて
どこが分からないのかぐらいは提示すべきです。
回答する方もどこから、どこまで回答すればよいのか
困ります。
えーと。どこから説明したものやら。
まず、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バイト目以降)』となります。
ビックエンディアンとかリトルエンディアンとかも考慮すると・・・。
とりあえず、バイナリをテキスト変換したいなら、
文字コードを把握しておく必要がありますね。
文字コードが不明なデータの場合、バイナリの内容を見ただけでは、
元の文字コードを正しく判断する事はできない可能性がありますから。
(完全なる判定ではなく、「推測」程度ならば出来るでしょうけれども)
> 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です。
ツイート | ![]() |