C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[10]: ストリームから読み込んだバイト形式のデータを文字列に


(過去ログ 31 を表示中)

[トピック内 18 記事 (1 - 18 表示)]  << 0 >>

■14715 / inTopicNo.1)  ストリームから読み込んだバイト形式のデータを文字列に
  
□投稿者/ ガンモ (1回)-(2008/02/26(Tue) 13:28:58)

分類:[.NET 全般] 

VB.NETで質問です。初心者です。よろしくお願いします。

特に何が作りたいというわけではないのですが、色々勉強しているところです。

VB.NETのコンソールアプリで試しています。

半角、全角が混じったテキストファイルをバイト形式で読み込んで、そのままコンソールに数値を表示してみると、全角は2バイトですが、その1バイト目(?)が平仮名の場合必ず130になっています。漢字の場合はまちまちです。

2つの数値を何かしら計算して、2バイトに収まる数値に変換していると思うのですが、この変換方法はどういうふうになっているのでしょうか?EncodingクラスのGetStringとかを使えば、わざわざこんなことしなくても良いだろうとは思いますが、どういう理屈になっているのか知りたいです。

どうぞよろしくお願いします。
引用返信 編集キー/
■14716 / inTopicNo.2)  Re[1]: ストリームから読み込んだバイト形式のデータを文字列に
□投稿者/ ガンモ (3回)-(2008/02/26(Tue) 13:52:05)
すみません。補足です。

試していたら、まず16進数に変換して、1バイト目と2バイト目を、足し算ではなく、ただ並べてできた数値を10進数に変換して、その数値をAsciiコードに照らし合わせたらできました。

つまり、
1バイト目が130
2バイト目が177

だとしたら、どっちも16進数に変換すると

1バイト目が82
2バイト目がB1

これをただ並べると82B1になって、これを10進数に直すと33457になって、これをVB.NETのChrWで表示してあげると『こ』になります。テキストファイルを見るとちゃんと『こ』になっていました。

2バイトの数値に納めるというルールがあったので、そのルールに基づいて色々やったらたまたまできました。

これはどういう意味なのでしょうか?上の変換は明らかにオーバーヘッドが大きいので、ダイレクトに変換できると思うのですが・・・。また、バイトを扱う上で、上のような1バイト目と2バイト目の関係は一般的なものでしょうか?

どなたか教えてください。よろしくお願いいたします。
引用返信 編集キー/
■14717 / inTopicNo.3)  Re[2]: ストリームから読み込んだバイト形式のデータを文字列に
□投稿者/ ガンモ (4回)-(2008/02/26(Tue) 13:52:10)
No14716 (ガンモ さん) に返信
> すみません。補足です。
>
> 試していたら、まず16進数に変換して、1バイト目と2バイト目を、足し算ではなく、ただ並べてできた数値を10進数に変換して、その数値をAsciiコードに照らし合わせたらできました。
>
> つまり、
> 1バイト目が130
> 2バイト目が177
>
> だとしたら、どっちも16進数に変換すると
>
> 1バイト目が82
> 2バイト目がB1
>
> これをただ並べると82B1になって、これを10進数に直すと33457になって、これをVB.NETのChrWで表示してあげると『こ』になります。テキストファイルを見るとちゃんと『こ』になっていました。
>
> 2バイトの数値に納めるというルールがあったので、そのルールに基づいて色々やったらたまたまできました。
>
> これはどういう意味なのでしょうか?上の変換は明らかにオーバーヘッドが大きいので、ダイレクトに変換できると思うのですが・・・。また、バイトを扱う上で、上のような1バイト目と2バイト目の関係は一般的なものでしょうか?
>
> どなたか教えてください。よろしくお願いいたします。
引用返信 編集キー/
■14718 / inTopicNo.4)  Re[1]: ストリームから読み込んだバイト形式のデータを文字列に
□投稿者/ 774RR (135回)-(2008/02/26(Tue) 13:56:53)
「そう決めたから」であって、「変換」というのはあまり適切な表現ではないな
テキストファイルをバイナリで読んで、ということだと SJIS (CodePage 932) であるはず。
「あ」には 0x82A0 というコードを割り当てる、と皆で決めた
「ん」には 0x82F1 というコードを割り当てる、と皆で決めた
結果、ひらがな文字すべてにたまたま 0x82** というコードが割り振られたわけだ。
0x82=130 ということで、そういう結果になる

Microsoft IME (標準のかな漢字変換) が使えるようなら IME パッドを開いてみよう
文字一覧→ひらがなを表示すると、マウスを各文字の上に持っていくとコードが表示される

引用返信 編集キー/
■14719 / inTopicNo.5)  Re[1]: ストリームから読み込んだバイト形式のデータを文字列に
□投稿者/ 魔界の仮面弁士 (656回)-(2008/02/26(Tue) 13:58:59)
No14715 (ガンモ さん) に返信
> 半角、全角が混じったテキストファイルを
そのテキストファイルの文字コードは何ですか?


> バイト形式で読み込んで、そのままコンソールに数値を表示してみると、
> 全角は2バイトですが、その1バイト目(?)が平仮名の場合必ず130になっています。
Shift_JIS の場合、平仮名の領域は
  ぁ 829F
  あ 82A0
  ぃ 82A1
  い 82A2
   :
  ゑ 82EF
  を 82F0
  ん 82F1
のようになっています(16進数表記)。
先導バイトが 82 なので、10進数でいうと 130 ですね。


> 2つの数値を何かしら計算して、2バイトに収まる数値に変換していると思うのですが、
> この変換方法はどういうふうになっているのでしょうか?
バイトデータでいうと、16進数表記で
 21〜7E: JIS X 0201 ローマ字
 A1〜DF: JIS X 0201 片仮名
にあるものが、1バイトで1文字を表す事になっています。

そして、81〜9F, E0〜EF の範囲が 2バイト文字の先導バイトです。
これらのデータは、直後に 40〜7E, 80〜FC の範囲のデータを伴い、
2バイトで1文字を表す仕様となっています。


この事から、81 などのデータは、「1バイト目」にも「2バイト目」にもなれます。
たとえば、
 =  8181
 a  8281
 ≠  8182
 b  8282
のような場合ですね。

引用返信 編集キー/
■14720 / inTopicNo.6)  Re[2]: ストリームから読み込んだバイト形式のデータを文字列に
□投稿者/ 魔界の仮面弁士 (657回)-(2008/02/26(Tue) 14:04:45)
No14716 (ガンモ さん) に返信
> これをただ並べると82B1になって、これを10進数に直すと33457になって、
> これをVB.NETのChrWで表示してあげると『こ』になります。

「Chr関数」と「ChrW関数」を間違えていませんでしょうか。

おっしゃる通り、
 Dim C As Integer = &H82B1
は 33457 となりますが、それを ChrW にかけても
 Dim S As String = ChrW(C)
「花」という文字になってしまうはずです。
引用返信 編集キー/
■14721 / inTopicNo.7)  Re[3]: ストリームから読み込んだバイト形式のデータを文字列に
□投稿者/ ガンモ (5回)-(2008/02/26(Tue) 14:15:16)
お返事ありがとうございます!

なるほど納得な感じです。感謝!

○仮面さん
ごめんなさい。Chr()でした。いい加減なこと書いちゃいました。すみません。

○追加で質問しちゃいたいです
厚かましいですが、なんか詳しいそうな方が質問に答えてくれてしまって恐縮しているのと、この機会を逃したくない漢字なので、追加で質問させてください。よろしくお願いします。

VB.NETで、テキストをバイト形式で取得するとき、これを10進数ではなくて、16進数で取得する方法はありますか?バイトから文字列変換のルール(Shift_Jisの場合だけ?)を教えていただいたので、自分でStreamクラスを継承した読み書きクラスを作ってみようと思います。でもわざわざ10進数を16進数に変換していたでは、処理が重くなってしまうので・・・。
引用返信 編集キー/
■14722 / inTopicNo.8)  Re[4]: ストリームから読み込んだバイト形式のデータを文字列に
□投稿者/ 774RR (136回)-(2008/02/26(Tue) 14:32:00)
「数」に10進数も16進数も無いというのは理解しているかい?
数を「表記する」ときに10進数表記や16進数表記があるだけだよ

引用返信 編集キー/
■14723 / inTopicNo.9)  Re[5]: ストリームから読み込んだバイト形式のデータを文字列に
□投稿者/ ガンモ (7回)-(2008/02/26(Tue) 14:34:00)
でも、コードに対応した文字を取得しようとする場合、ご指摘の表記の違いが重要になりませんか??

上の例で10進数のまま130と177を並べて130177を作っても意味がないと思うのですが・・・。すみません。確かにあまり理解はしていないです。
引用返信 編集キー/
■14724 / inTopicNo.10)  Re[6]: ストリームから読み込んだバイト形式のデータを文字列に
□投稿者/ ガンモ (9回)-(2008/02/26(Tue) 14:37:23)
・・・確かに変な質問でした。いわれて分かりました。ごめんなさい。

つまり、私が知りたいのは、取得した数値からダイレクト(16進数に変えたり10進数にしたりしないで)に対応する文字の取得方法はあるかということです。大変すみませんでした。
引用返信 編集キー/
■14725 / inTopicNo.11)  Re[4]: ストリームから読み込んだバイト形式のデータを文字列に
□投稿者/ 魔界の仮面弁士 (658回)-(2008/02/26(Tue) 14:38:09)
No14721 (ガンモ さん) に返信
> ○仮面さん
(-ー#

> 逃したくない漢字なので、
(^^;

> これを10進数ではなくて、16進数で取得する方法はありますか?
Dim buf() As Byte
buf = データ
Console.WriteLine(BitConverter.ToString(buf))
引用返信 編集キー/
■14726 / inTopicNo.12)  Re[7]: ストリームから読み込んだバイト形式のデータを文字列に
□投稿者/ ガンモ (12回)-(2008/02/26(Tue) 14:41:51)
魔界の仮面弁士様

お名前を省略してしまい、大変申し訳ございませんでした。こういう無礼は二度としません。ごめんなさい。
引用返信 編集キー/
■14727 / inTopicNo.13)  Re[6]: ストリームから読み込んだバイト形式のデータを文字列に
□投稿者/ επιστημη (839回)-(2008/02/26(Tue) 14:50:38)
επιστημη さんの Web サイト
> 上の例で10進数のまま130と177を並べて130177を作っても意味がないと思うのですが・・・。すみません。確かにあまり理解はしていないです。

130を256倍して177を加えるですよ。
そーすっと正しく33457になりますわ。

引用返信 編集キー/
■14728 / inTopicNo.14)  Re[7]: ストリームから読み込んだバイト形式のデータを文字列に
□投稿者/ ガンモ (14回)-(2008/02/26(Tue) 14:57:05)
επιστημηさん

お返事ありがとうございます。うわ、そういう感じなのですね。ありがとうございます。
というか、すみません、聞いてばかりで泣けてきますが、どういう理屈なんでしょうか。こういうのはご自分で思いついたのですか?それとも10進数とか16進数とか2進数とかを扱っていると分かる当然の知識ですか?
引用返信 編集キー/
■14729 / inTopicNo.15)  Re[8]: ストリームから読み込んだバイト形式のデータを文字列に
□投稿者/ ガンモ (16回)-(2008/02/26(Tue) 15:00:45)
επιστημηさん

変な質問をしてすみませんでした。256倍すると16進数にすると100倍することになって桁が増える感じな感じですね。それで、16進数の下二桁の2バイト目を足してやるとおんなじになる感じ?なんか分かった木がしました。すみませんでした。

No14728 (ガンモ さん) に返信
> επιστημηさん
>
> お返事ありがとうございます。うわ、そういう感じなのですね。ありがとうございます。
> というか、すみません、聞いてばかりで泣けてきますが、どういう理屈なんでしょうか。こういうのはご自分で思いついたのですか?それとも10進数とか16進数とか2進数とかを扱っていると分かる当然の知識ですか?
引用返信 編集キー/
■14730 / inTopicNo.16)  Re[9]: ストリームから読み込んだバイト形式のデータを文字列に
□投稿者/ ガンモ (18回)-(2008/02/26(Tue) 15:03:20)
皆様

大変な無礼になってしまってすみませんでした。
ご不快であったかと思います。ごめんなさい。

分からないことが分かって、とても感謝しています。ありがとうございました。
解決済み
引用返信 編集キー/
■14731 / inTopicNo.17)  Re[8]: ストリームから読み込んだバイト形式のデータを文字列に
□投稿者/ επιστημη (840回)-(2008/02/26(Tue) 15:04:41)
επιστημη さんの Web サイト
> というか、すみません、聞いてばかりで泣けてきますが、どういう理屈なんでしょうか。
> こういうのはご自分で思いついたのですか?
> それとも10進数とか16進数とか2進数とかを扱っていると分かる当然の知識ですか?

後者。

1バイトで表わせるのは10進での0〜255です。
漢字/かなの表現2バイト必要なのは0〜255では足りんから。
なので0〜255を表せる"バイト"をふたつ並べます。
  0= (0,0)
  1= (0,1)
.... 
255= (0,255) の次は
256= (1,0)
257= (1,1)
... と続きます。
ってわけで(x,y)は x*256+y を表します。

引用返信 編集キー/
■14732 / inTopicNo.18)  Re[10]: ストリームから読み込んだバイト形式のデータを文字列に
□投稿者/ 774RR (137回)-(2008/02/26(Tue) 15:14:32)
そもそも10進数表記ってのも
123 = 1*10*10 + 2*10 + 3
ってことだったよね

16進表記ってのも同じで
0x82A1 = 8*16*16*16 + 2*16*16 + 10*16 + 1
なわけだよ

16進表記で2桁=16の2乗=256個の数値が表記できる というわけなのさ
バイトという用語が16進数2桁分をあらわす目的に使われたときには
それは256進数表記を行っている、と考えていい
16進数表記4桁=256進数表記2桁と考えれば自然にそうなる

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -