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

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

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

Re[15]: データを数値と認識する方法。


(過去ログ 51 を表示中)

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

■28405 / inTopicNo.1)  データを数値と認識する方法。
  
□投稿者/ たけし (1回)-(2008/11/25(Tue) 23:05:58)

分類:[C#] 

2008/11/25(Tue) 23:09:26 編集(投稿者)
C#プログラムについて質問させてください。



機器に問い合わせた際に機器から、「任意の8ビットの値を持つデータ」であるブロックデータで返ってきます。

これをバイナリーデータにするのが目的です。


最初に、文字型で受信し、その後バイト型に変形させたいのですが、

「.Parse」メソッドを使うと「入力文字列の形式が正しくありません。」と出て、変形することが出来ません。

機器に問い合わせ直後は余計な文字列が入っていて、「文字列+8ビットの値を持つデータ」が返ってくるため、バイト型で受信しようとするとエラーが起きてしまいます。

何かよい方法はないでしょうか?


ちなみに、受信した文字列は「??9\a7\t」このような文字です。

引用返信 編集キー/
■28409 / inTopicNo.2)  Re[1]: データを数値と認識する方法。
□投稿者/ やじゅ (797回)-(2008/11/26(Wed) 00:23:28)
やじゅ さんの Web サイト
No28405 (たけし さん) に返信
> 機器に問い合わせた際に機器から、「任意の8ビットの値を持つデータ」であるブロックデータで返ってきます。
> 機器に問い合わせ直後は余計な文字列が入っていて、「文字列+8ビットの値を持つデータ」が返ってくるため、
> バイト型で受信しようとするとエラーが起きてしまいます。
> ちなみに、受信した文字列は「??9\a7\t」このような文字です。

で、受信した文字列はどういう数値になるのが正解なのでしょうか?
機器の仕様がまず分からないといけないのではないですか

その上で受信した文字列のデータ位置を把握して、変換ってことになるわけです。
http://www.atmarkit.co.jp/fdotnet/dotnettips/045getbytes/getbytes.html
引用返信 編集キー/
■28410 / inTopicNo.3)  Re[2]: データを数値と認識する方法。
□投稿者/ たけし (2回)-(2008/11/26(Wed) 00:56:16)
No28409 (やじゅ さん) に返信


> その上で受信した文字列のデータ位置を把握して、変換ってことになるわけです。
> http://www.atmarkit.co.jp/fdotnet/dotnettips/045getbytes/getbytes.html


ありがとうございます!
明日出来る環境になったら試してみます。



> で、受信した文字列はどういう数値になるのが正解なのでしょうか?
> 機器の仕様がまず分からないといけないのではないですか
>


すみません、書き忘れてました。
データは8ビットで、取りうる値は0〜255です。
引用返信 編集キー/
■28412 / inTopicNo.4)  Re[3]: データを数値と認識する方法。
□投稿者/ Jitta on the way (230回)-(2008/11/26(Wed) 07:46:22)
No28410 (たけし さん) に返信

> すみません、書き忘れてました。
> データは8ビットで、取りうる値は0〜255です。

だから、「ちなみに、受信した文字列は
「??9\a7\t」このような文字です。」が、どうなるのですか?
引用返信 編集キー/
■28430 / inTopicNo.5)  Re[4]: データを数値と認識する方法。
□投稿者/ たけし (3回)-(2008/11/26(Wed) 10:29:00)

> だから、「ちなみに、受信した文字列は
> 「??9\a7\t」このような文字です。」が、どうなるのですか?


2バイトが1つの数値となると思います。
引用返信 編集キー/
■28432 / inTopicNo.6)  Re[5]: データを数値と認識する方法。
□投稿者/ .SHO (178回)-(2008/11/26(Wed) 10:43:56)
「??9\a7\t」で、ちゃんとバイナリデータとして受信できてるのでは?
よくわかんないけど…
引用返信 編集キー/
■28437 / inTopicNo.7)  Re[6]: データを数値と認識する方法。
□投稿者/ 渋木宏明(ひどり) (963回)-(2008/11/26(Wed) 11:33:09)
渋木宏明(ひどり) さんの Web サイト
> 「??9\a7\t」で、ちゃんとバイナリデータとして受信できてるのでは?
> よくわかんないけど…

「ブロックデータ」なんて書いてあるので、「自分が思った通りに、切れ目よく受信できる」と思ってるんでしょう。

まずは、書籍などで「PCでのシリアル通信の基礎知識」をきちんと身につけること、そしてプログラム的には

>バイト型で受信しようとするとエラーが起きてしまいます。

を解決するところから手をつけるべきでしょう。

引用返信 編集キー/
■28444 / inTopicNo.8)  Re[5]: データを数値と認識する方法。
□投稿者/ Jitta (541回)-(2008/11/26(Wed) 12:00:02)
No28430 (たけし さん) に返信
>
>>だから、「ちなみに、受信した文字列は
>>「??9\a7\t」このような文字です。」が、どうなるのですか?
>
>
> 2バイトが1つの数値となると思います。
??????????

なぜ2バイトが1つの数値になるのですか?1バイトは、現在では8ビットとされています(本来は、その処理系が扱いやすい長さ)。私は「8ビットの値」と書いてあったので、「1バイトの数値」だと思っていたのですが。。。
あるいは、どことどこの2バイトで、1つの数値になるのですか?
最初の投稿には「文字列+8ビットの値を持つデータ」と書かれています。では、このデータのどこまでが「文字列」で、どこからが「8ビットの値」なのでしょう?

あるいは。
なぜ、byte で受信したものを「文字列」として掲示板にペーストするのですか?化けるのは当然ですよね?


「初心者なのでわからなかった」という言い訳はしないでください。「初心者」は、知ろうとしないことの言い訳にはなりません。他の人も含めて、回答された方々の何がわからないのか、具体的に書いてください。
私たちは、あなたを知りません。あなたがどんなことを知っているのか、知りません。あなたが自分を「初心者」と判断する基準を知りません。そういった情報を与えていただかないと、何をどう書いたらあなたが理解できるのか、わかりません。


-----
No28437 (渋木宏明(ひどり) さん) に返信

> >バイト型で受信しようとするとエラーが起きてしまいます。
>
> を解決するところから手をつけるべきでしょう。

あ、そう理解されましたか。
私は文字列とバイト型の合わさったものを Parse しようとして、Parse がエラーになる、、、と理解したのですが。

第一、バイト型ってことは、すでに数値なんですよね。それをどう変換したいのか、わからん(>_<)
引用返信 編集キー/
■28448 / inTopicNo.9)  Re[6]: データを数値と認識する方法。
□投稿者/ たくボン (81回)-(2008/11/26(Wed) 12:38:21)
No28444 (Jitta さん) に返信
> ■No28430 (たけし さん) に返信
>>2バイトが1つの数値となると思います。
> ??????????

朝回答しようとしたけど、8byteと8bitを勘違いしてたので書き込みをやめたへっぽこです(笑)

まず、たけしさんはbit・byte、文字列・バイナリの違いを区別して、もう一度正確に質問するのがいいと思いますよ。
話の流れを見ていても、byte・bitの区別が出来てないみたいですし、冒頭にある「受信した文字列は「??9\a7\t」このような文字です。」についても、

・byteで受信できなかったので【文字列で受信したデータ】(不定の文字列+8bit)

なのか、

・受信したデータのうち、【文字列として認識されるべき領域】(8bitの部分は別領域)

なのか、さっぱりわかりません。


> 「初心者なのでわからなかった」という言い訳はしないでください。「初心者」は、知ろうとしないことの言い訳にはなりません。他の人も含めて、回答された方々の何がわからないのか、具体的に書いてください。

まぁ、初心者かどうかは別として、機器からの応答の仕様がわかる時点で同業者だとは思いますが・・・。製品は買いたくはないですね(笑)
引用返信 編集キー/
■28452 / inTopicNo.10)  Re[7]: データを数値と認識する方法。
□投稿者/ たけし (4回)-(2008/11/26(Wed) 13:17:25)
No28437 (渋木宏明(ひどり) さん) に返信
>>「??9\a7\t」で、ちゃんとバイナリデータとして受信できてるのでは?
>>よくわかんないけど…
> 
> 「ブロックデータ」なんて書いてあるので、「自分が思った通りに、切れ目よく受信できる」と思ってるんでしょう。
> 
> まずは、書籍などで「PCでのシリアル通信の基礎知識」をきちんと身につけること、そしてプログラム的には
> 
> >バイト型で受信しようとするとエラーが起きてしまいます。
> 
> を解決するところから手をつけるべきでしょう。
> 




この機器ではブロックデータというもので返ってきてしまいます。

ブロックデータの説明は、前述したとおりです。








>「任意の8ビットの値を持つデータ」であるブロックデータで返ってきます。
わかりづらかったみたいなので追記しますと、


機器から返ってくる
↓
ブロックデータ=<文字列><データバイトの並び>


となっていまして、「??9\a7\t」というのが、ブロックデータより文字列を切り捨て、データのみを取ったものです。

それを「数値データ」として読み取りたいため、バイト型で格納しようと考えました。








>まずは、書籍などで「PCでのシリアル通信の基礎知識」をきちんと身につけること、


すみません、勉強不足です。
調べているのですがよくわからなくて。。


>バイト型で受信しようとするとエラーが起きてしまいます。
>を解決するところから手をつけるべきでしょう。


受信する段階では文字列がくっついているので、無理かと。。

引用返信 編集キー/
■28453 / inTopicNo.11)  Re[8]: データを数値と認識する方法。
□投稿者/ .SHO (183回)-(2008/11/26(Wed) 13:25:49)
2008/11/26(Wed) 13:27:41 編集(投稿者)

No28452 (たけし さん) に返信

ようするに

byte b1 = (byte) データのみを取ったもの[0];
byte b2 = (byte) データのみを取ったもの[1];

じゃないですか?
引用返信 編集キー/
■28454 / inTopicNo.12)  Re[7]: データを数値と認識する方法。
□投稿者/ .SHO (184回)-(2008/11/26(Wed) 13:30:09)
2008/11/26(Wed) 13:35:02 編集(投稿者)

でも、機器から送られてきた「??9\a7\t」って
UNICODEになってるのかな?
引用返信 編集キー/
■28455 / inTopicNo.13)  Re[6]: データを数値と認識する方法。
□投稿者/ たけし (5回)-(2008/11/26(Wed) 13:32:08)
> なぜ2バイトが1つの数値になるのですか?1バイトは、現在では8ビットとされています(本来は、その処理系が扱いやすい長さ)。私は「8ビットの値」と書いてあったので、「1バイトの数値」だと思っていたのですが。。。
> あるいは、どことどこの2バイトで、1つの数値になるのですか?
> 最初の投稿には「文字列+8ビットの値を持つデータ」と書かれています。では、このデータのどこまでが「文字列」で、どこからが「8ビットの値」なのでしょう?
> 




私もよくわかってないのですが、機器の仕様ですとしか言いようがないです。
受信した1文字が1バイトで、2文字の2バイトで1つの数値データになるみたいです。

すみません、書き間違えです。
上記のデータ「??9\a7\t」が2つの文字で1つの8ビットの値を持つデータになると思います。




> あるいは。
> なぜ、byte で受信したものを「文字列」として掲示板にペーストするのですか?化けるのは当然ですよね?
> 


おっしゃってる意味がよくわかりません。
「??9\a7\t」
このように受信されてます。
特に掲示板のせいで化けたということはありません。
と繋げることは出来ませんか?
皆様に伝わらないと意味が無いと思いますが、



> あ、そう理解されましたか。
> 私は文字列とバイト型の合わさったものを Parse しようとして、Parse がエラーになる、、、と理解したのですが。
> 
> 第一、バイト型ってことは、すでに数値なんですよね。それをどう変換したいのか、わからん(>_<)





>>最初に、文字型で受信し、その後バイト型に変形させたいのですが、

このとおり、文字列として受信したデータをParseしてバイト型に入れようとしたけど無理だった、という意味です。


引用返信 編集キー/
■28456 / inTopicNo.14)  Re[8]: データを数値と認識する方法。
□投稿者/ たけし (6回)-(2008/11/26(Wed) 13:35:02)
No28454 (.SHO さん) に返信



>ようするに

>byte b1 = (byte) データのみを取ったもの[0];
>byte b2 = (byte) データのみを取ったもの[1];

>じゃないですか?



そうです!
受信したデータの1文字が1byteにあたります。




> でも、聞きから送られてきた「??9\a7\t」って
> UNICODEになってるのかな?



わかりません。。。

コマンドで送信しているだけなので、機器の故障とか、読み取れない文字を送ってる…など考えられますが。。
引用返信 編集キー/
■28457 / inTopicNo.15)  Re[9]: データを数値と認識する方法。
□投稿者/ .SHO (185回)-(2008/11/26(Wed) 13:36:28)
No28456 (たけし さん) に返信

> >byte b1 = (byte) データのみを取ったもの[0];
> >byte b2 = (byte) データのみを取ったもの[1];
>
> そうです!

そうですって…これで解決ですか?
引用返信 編集キー/
■28458 / inTopicNo.16)  Re[7]: データを数値と認識する方法。
□投稿者/ .SHO (186回)-(2008/11/26(Wed) 13:41:14)
No28455 (たけし さん) に返信

> 上記のデータ「??9\a7\t」が2つの文字で1つの8ビットの値を持つデータになると思います。

2つの文字(16ビット?)で1つの8ビット値を表現するのは、機器の仕様でしょうから
別に構いませんが、その機器がどう表現しているのかをきちんと調べ
ビット演算子を使用して、自分で byte に変換するしかないです。

C#の Parse などの基本的な処理を使用して変換するのは不可能です。
引用返信 編集キー/
■28459 / inTopicNo.17)  Re[8]: データを数値と認識する方法。
□投稿者/ なちゃ (214回)-(2008/11/26(Wed) 13:53:43)
機器からのデータの仕様を正確に書けばすぐアドバイスもらえると思いますよ。


先頭の文字列の文字コード(まあASCIIのみかもしれませんが)と、
どこで文字列が終わりか(文字列とバイトデータの区切り仕様、何かの文字とか、固定のバイト数とか)と、
その後のバイト列仕様(複数バイトなら)
の厳密な仕様です。
機器のマニュアルに載ってるはずだと思いますよ。
引用返信 編集キー/
■28460 / inTopicNo.18)  Re[9]: データを数値と認識する方法。
□投稿者/ ぽぴ王子 (414回)-(2008/11/26(Wed) 14:05:15)
ぽぴ王子 さんの Web サイト
No28455 (たけし さん) に返信

>>あるいは。
>>なぜ、byte で受信したものを「文字列」として掲示板にペーストするのですか?化けるのは当然ですよね?
>>
>
>
> おっしゃってる意味がよくわかりません。
> 「??9\a7\t」
> このように受信されてます。
> 特に掲示板のせいで化けたということはありません。
> と繋げることは出来ませんか?
> 皆様に伝わらないと意味が無いと思いますが、

こう書かれているところから察すると、バイト列と文字列の区別がついていないように見えますが。

たけしさんの言われる「文字列+8ビットの値を持つデータ」も、実際はバイナリで送信されている
はずです。
「ABC」という文字列は、実際は 0x41 0x42 0x43 という3バイトが送信されています。
その文字列に続いて「8ビットの値を持つデータ」が送信されているとしたら

0x41 0x42 0x43 0x02 0x04 0x01 0x37 0x09

のようなデータとして送られてきているのではないでしょうか。

たけしさんはそのデータをバイト型で受信できないので、文字列として取得してみたところ、前半の
文字列部分はそのまま string として取得できたけれども、後半部分はよくわからない文字になって
しまっているので、どうしたらいいか、と。

まずは、文字列として取得することが間違いです。
上記のように、送られてくるデータは「たまたま文字列っぽく見えているデータ」というだけで、実際は
すべてがバイナリデータ(たけしさんの言われる「8ビットの値を持つデータ」)として送られている
と思ってください。その上で、前半の文字列に変換できる部分は文字列に、後半のバイナリ部分は
1バイトずつ計算して数値として取得する、といった処理が必要になります。

上記のデータを例に取れば、0x41 0x42 0x43 を byte 型の配列として取得し、そこから string 型
の値として取り出せば、バイナリから文字列への変換はできるはずです。
どこまでを文字列として取得するかとか、文字エンコードはどうなっているのか、など機器を実際に
操作できるたけしさんしか知り得ない部分もありますが。

残りの 0x02 0x04 0x01 0x37 0x09 というデータを変換するとして、例えば 0x02 0x04 の2バイトを
0x0204 という1ワード(16ビット)の数値として取得できれば大丈夫だと思います。

で、こういったヒント的なことは提言できますが、バイト列と文字列の区別がつかなそうな現状から
たけしさんにたけしさんが求める答えが理解できるまで説明するのは、まず不可能です。
ですので、渋木さんも

> ■No28437 (渋木宏明(ひどり) さん) に返信
> >>「??9\a7\t」で、ちゃんとバイナリデータとして受信できてるのでは?
> >>よくわかんないけど…
>>
>>「ブロックデータ」なんて書いてあるので、「自分が思った通りに、切れ目よく受信できる」と思ってるんでしょう。
>>
>>まずは、書籍などで「PCでのシリアル通信の基礎知識」をきちんと身につけること、そしてプログラム的には
>>
>>>バイト型で受信しようとするとエラーが起きてしまいます。
>>
>>を解決するところから手をつけるべきでしょう。

と書かれています。それに対して

> すみません、勉強不足です。
> 調べているのですがよくわからなくて。。

この返信ですと「今すぐ調べる気なんかないから、おまえらとっとと答えを教えろ!」という風に
言っているようにも感じるのです(あくまで私の主観なので違うかもしれませんが)。

とりあえず、送信されてくるデータを文字列で取得するという部分はまったくもって間違いだと思うので
そこを byte 型で読み込むようにすることから始めたらどうでしょうか。
できるところからコツコツやっていく分には、アドバイスもしやすいと思います。
引用返信 編集キー/
■28469 / inTopicNo.19)  Re[8]: データを数値と認識する方法。
□投稿者/ たけし (7回)-(2008/11/26(Wed) 16:15:31)
No28458 (.SHO さん) に返信
> ■No28455 (たけし さん) に返信
>
>>上記のデータ「??9\a7\t」が2つの文字で1つの8ビットの値を持つデータになると思います。
>
> 2つの文字(16ビット?)で1つの8ビット値を表現するのは、機器の仕様でしょうから
> 別に構いませんが、その機器がどう表現しているのかをきちんと調べ
> ビット演算子を使用して、自分で byte に変換するしかないです。
>
> C#の Parse などの基本的な処理を使用して変換するのは不可能です。





ありがとうございます。
マニュアルには書いてないので、企業に問い合わせるしかないかもしれませんね。

Parseなどで出来ないとわかっただけで、ありがたいです。
引用返信 編集キー/
■28470 / inTopicNo.20)  Re[9]: データを数値と認識する方法。
 
□投稿者/ .SHO (187回)-(2008/11/26(Wed) 16:38:01)
No28469 (たけし さん) に返信

> マニュアルには書いてないので、企業に問い合わせるしかないかもしれませんね。
> Parseなどで出来ないとわかっただけで、ありがたいです。

念の為に補足しておきますが、parseなどで出来ないというのは
『2バイトで8ビットを表現する』というのが正しいという前提です。
(たぶん、何かの勘違いじゃないのかな?とは思うのですが)

マニュアルに書いていないというのは、マニュアルが手元にないわけではなく
マニュアルはあるけど、文字通り書いていないということでしたら
そんな複雑な処理はしていないと思われます。
その場合、ぽぴ王子さんの回答が適切だと思います。
引用返信 編集キー/

次の20件>
トピック内ページ移動 / << 0 | 1 >>

管理者用

- Child Tree -