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

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

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

Re[4]: byteをstringに


(過去ログ 178 を表示中)

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

■102004 / inTopicNo.1)  byteをstringに
  
□投稿者/ たかし (10回)-(2023/05/26(Fri) 16:57:09)

分類:[C#] 

宜しくお願い致します

c# Windows フォームアプリケーション .Net Framework

string sendMessage = "RDS EM000.H 7" + '\r';
byte[] byteReciveMessage = SendAndRecieve(sendMessage);
string result = encoding.GetString(byteReciveMessage);

byteをstringに変えた後を教えて頂けないでしょうか

今 resultの中に "3646 3142 3036 3137 3031 3031 0000\r\0"と入っているのですが
それを"6F1B06170101"と表示させたいのですがどう書けばよろしいでしょうか
宜しくお願い致します

引用返信 編集キー/
■102005 / inTopicNo.2)  Re[1]: byteをstringに
□投稿者/ WebSurfer (2697回)-(2023/05/26(Fri) 17:09:30)
No102004 (たかし さん) に返信

> 今 resultの中に "3646 3142 3036 3137 3031 3031 0000\r\0"と入っているのですが
> それを"6F1B06170101"と表示させたいのですがどう書けばよろしいでしょうか

どういう変換法則があるのですか?
引用返信 編集キー/
■102006 / inTopicNo.3)  Re[1]: byteをstringに
□投稿者/ kiku (352回)-(2023/05/26(Fri) 17:18:46)
No102004 (たかし さん) に返信
> 宜しくお願い致します
>
> c# Windows フォームアプリケーション .Net Framework
>
> string sendMessage = "RDS EM000.H 7" + '\r';
> byte[] byteReciveMessage = SendAndRecieve(sendMessage);
> string result = encoding.GetString(byteReciveMessage);
>
> byteをstringに変えた後を教えて頂けないでしょうか
>
> 今 resultの中に "3646 3142 3036 3137 3031 3031 0000\r\0"と入っているのですが
> それを"6F1B06170101"と表示させたいのですがどう書けばよろしいでしょうか
> 宜しくお願い致します

こんな感じで

var testdata1 = new byte[] { 0x36, 0x46, 0x31, 0x42, 0x30, 0x36, 0x31, 0x37, 0x30, 0x31, 0x30, 0x31, 0x00, 0x00, 0x0d, 0x0a };
var testdata2 = testdata1.Take(6 * 2).ToArray();
var testresult = System.Text.Encoding.ASCII.GetString(testdata2);

引用返信 編集キー/
■102007 / inTopicNo.4)  Re[2]: byteをstringに
□投稿者/ たかし (11回)-(2023/05/26(Fri) 17:22:50)
No102005 (WebSurfer さん) に返信
> ■No102004 (たかし さん) に返信
>
>>今 resultの中に "3646 3142 3036 3137 3031 3031 0000\r\0"と入っているのですが
>>それを"6F1B06170101"と表示させたいのですがどう書けばよろしいでしょうか
>
> どういう変換法則があるのですか?

分かりにくくてすみません
今現在変換させているのは下記のようにしています

for (int i = 0; i < 8; i++)//0-7
{
string sendMsg = "RDS EM00" + i + ".U 1" + '\r';

Encoding enc = Encoding.ASCII;
byte[] sendBytes = enc.GetBytes(sendMsg);

netstream.Write(sendBytes, 0, sendBytes.Length);
Console.WriteLine(sendMsg);

System.IO.MemoryStream ms = new System.IO.MemoryStream();
byte[] resBytes = new byte[256];
int resSize = 0;

do
{
resSize = netstream.Read(resBytes, 0, resBytes.Length);
if (resSize == 0)
{
messagebox("サーバーが切断しました。");
break;
}
ms.Write(resBytes, 0, resSize);
}
while (netstream.DataAvailable || resBytes[resSize - 1] != '\n');

string resMsg = enc.GetString(ms.GetBuffer(), 0, (int)ms.Length);
ms.Close();

resMsg = resMsg.TrimEnd('\n');


ushort number = ushort.Parse(resMsg);
byte[] byteArray = BitConverter.GetBytes(number);
Array.Reverse(byteArray);
string str = Encoding.ASCII.GetString(byteArray);
numb[i] = str;
}

string number2 = null;
for (int k=0; k<8; k++)
{
number2 += numb[k];
}

number2 = number2.TrimEnd('\0');
searchTextBox.Text = number2;

無理やり変換して最後に繋いでいるのですが短いコードで出来る方法はないでしょうか
引用返信 編集キー/
■102009 / inTopicNo.5)  Re[1]: byteをstringに
□投稿者/ furu (210回)-(2023/05/26(Fri) 18:32:16)
No102004 (たかし さん) に返信
> 今 resultの中に "3646 3142 3036 3137 3031 3031 0000\r\0"と入っているのですが
> それを"6F1B06170101"と表示させたいのですがどう書けばよろしいでしょうか
var number2 = 
    result
        .TrimEnd('\r', '\0')
        .Split(' ')
        .Where(a => a != "0000")
        .Select(a => ((char)Convert.ToInt32(a.Remove(2), 16)).ToString() +
                     ((char)Convert.ToInt32(a.Substring(2), 16)).ToString())
        .Aggregate((a, b) => a + b);

もうちょっとなんとかなりそうな

引用返信 編集キー/
■102010 / inTopicNo.6)  Re[2]: byteをstringに
□投稿者/ くま (3回)-(2023/05/26(Fri) 18:37:43)
2023/05/26(Fri) 18:41:18 編集(投稿者)

だからいったのに...
http://bbs.wankuma.com/index.cgi?mode=al2&namber=101979
でも書いたけど
ツールの作り方 &#8211; 通信編/上位リンク(KEYENCE)
https://plc-memo.com/maketool5/

vb.net→C#コード変換
http://www.carlosag.net/Tools/CodeTranslator/

でデータ読み込むでしょ?

例だと57行目でShortの配列にしてるけど
Shortの値をそのまま文字列に変換すればいいだけ。


でも結局"shift_jis"で変換するんじゃないの?
System.Text.Encoding("shift_jis").GetString()

引用返信 編集キー/
■102013 / inTopicNo.7)  Re[3]: byteをstringに
□投稿者/ WebSurfer (2700回)-(2023/05/26(Fri) 19:11:45)
No102007 (たかし さん) に返信

> 分かりにくくてすみません
> 今現在変換させているのは下記のようにしています
>
> for (int i = 0; i < 8; i++)//0-7
> {
> string sendMsg = "RDS EM00" + i + ".U 1" + '\r';
>

さっぱり分かりません。質問者さんの前のスレッドに遡って読まないと何がしたいのか
分からないのではと思いますが、とてもそんな気力は沸いてきません。

質問者さんがそれをここに書いてあること以外は知り得ない赤の他人が読んでわかる言葉
で、

> 今 resultの中に "3646 3142 3036 3137 3031 3031 0000\r\0"と入っているのですが
> それを"6F1B06170101"と表示させたいのですがどう書けばよろしいでしょうか

の変換法則を言語化してもらう必要があります。


引用返信 編集キー/
■102015 / inTopicNo.8)  Re[2]: byteをstringに
□投稿者/ くま (4回)-(2023/05/26(Fri) 19:54:19)
追記です

初めの質問だと
> string sendMessage = "RDS EM000.H 7" + '\r';
連続データ読出、拡張データメモリの0番から7バイト(ワード)16進数で取得する
16進数で取得する場合5文字(数字4文字+スペース)で1ワードなので
7バイト * 5文字 = 35文字 = 35バイト応答内容を取得する

次に書かれた内容だと
> string sendMsg = "RDS EM00" + i + ".U 1" + '\r';
連続データ読出、拡張データメモリの0番から1バイト(ワード)符号無し10進数で順次取得する
10進数で取得する場合6文字(数字5文字+スペース)で1ワードなので
1バイト * 6文字 = 6文字 = 6バイトずつ応答内容が帰ってきていませんか?

疑問点1.
"DM"(データメモリ)ではなく
"EM"(拡張データメモリ)で大丈夫ですか?
その場合メモリアドレス0番からの参照でよいのですか?

疑問点2.
応答内容が4バイトの場合エラーとなります。
チェックしている所が見当たりませんが大丈夫ですか?

疑問点3.
"EM"(拡張データメモリ)に入っている値は数値それとも文字どちらですか?

疑問点4.
サンプルを提示したりしているのですが試されないのはなぜ?
vb.netからC#への変換はサイトで自動変換できますし、よくわからなければ「vb.net→C#変換がわからない」
と書いていただけたら変換したソースをお渡しする事もできるのですが...?

引用返信 編集キー/
■102016 / inTopicNo.9)  Re[1]: byteをstringに
□投稿者/ HattariB (71回)-(2023/05/28(Sun) 10:05:35)
No102004 (たかし さん) に返信

横槍失礼しますけど、
「たかしさん」は、こういった掲示板に質問を投げかけるための基礎知識が足りないか、
記憶が曖昧で、適切な質問を作れていないように思えます。

並行で良いから、そこを補うための努力も必要だと思いますわ。

せめて、「数値・文字表現」、「2進数・10進数・16進数」、ビット、バイト、文字コード...
とかの理解が出来れいれば、

「通信で得た文字コード列をHEX文字列で表記したい...」

みたいな質問ができるんじゃぁ無いすか?

基礎のお勉強が足りてないし、それは掲示板とかで求めるもんじゃぁないすよ。
引用返信 編集キー/
■102018 / inTopicNo.10)  Re[2]: byteをstringに
□投稿者/ HattariB (72回)-(2023/05/30(Tue) 06:40:25)
No102004 (たかし さん) に返信
蛇足にもうひとつ。

C#に限らず、プログラミングに関する、勉強の順序みたいな指針を伝えてくれる一文を紹介しますね。
引用したのはCだけど。

/*ここから
どんなに優れた記事も、全範囲をカバーする教科書やC言語のマニュアルを注意深く読むことの代用とはならない。
C言語に関心があって、このグループを読もうとする者であれば、

これらのマニュアルを何冊か、できれば数回読むことにも関心を払うことであろう。

・・・・・

Cに関する質問でこの本に答えの載っていないものがあれば、

でたとこ勝負で ネットに質問するのではなく、
教科書を何冊かあたるか博識な同僚に相談すること。

http://www.kouno.jp/home/c_faq/c0.html#0
ここまで*/

ネット以外での「たかしさん」にとってのバイブルと、身近な同僚を見つけようよ。
引用返信 編集キー/
■102019 / inTopicNo.11)  Re[3]: byteをstringに
□投稿者/ たかし (12回)-(2023/06/02(Fri) 15:35:48)
No102018 (HattariB さん) に返信

ありがとうございます
その通りだと思います
皆さんすみませんでした。行き当たりばったりの質問ばかりになってしまいましたことを
お詫びいたします
もう少し勉強して、考えて質問ができる様にさせて頂きたいと思います
引用返信 編集キー/
■102020 / inTopicNo.12)  Re[4]: byteをstringに
□投稿者/ HattariB (73回)-(2023/06/02(Fri) 22:45:27)
No102019 (たかし さん) に返信
へぇー
見どころはあるかもね。

勉強の過程で、ふと何かにすがってしまう事は、誰しもによくある事なので、
詫びを入れる必要は、、、、あっても良いかもだけど、
オイラもこの板で意思疎通の失敗を何度かやらかしてしまってるから、本当は他人に言えなかったりもする。

>もう少し勉強して、
今時、C#でPLCと通信する事はよくある事だし、文字コードをモチーフにしてデータの扱い方を覚えさせるってのも良くあるので、
初めてPLCを扱う処じゃ無かったら、
コマンド送って→応答貰って→表示して、、、
っつーサイクルのソースも枯れていると思うので、おそらく「OJTか何かの課題だったんだろうな」と思ったのは正直なところ。

最初の質問でも、2回目の質問でも、良いヒントと、良い誘導はあったので、
それらが言わんとしているところを理解するべく勉強すればよかったのにと思います。

知らないことは罪ではない。頑張ってください。

※1ニブルは4ビット。1オクテットは8ビット。asciiコードは0x30が'0'。
引用返信 編集キー/
■102021 / inTopicNo.13)  Re[4]: byteをstringに
□投稿者/ WebSurfer (2701回)-(2023/06/03(Sat) 09:55:21)
No102019 (たかし さん) に返信

No102013 で、

> 質問者さんがそれをここに書いてあること以外は知り得ない赤の他人が読んでわかる言葉
> で、
>
>>今 resultの中に "3646 3142 3036 3137 3031 3031 0000\r\0"と入っているのですが
>>それを"6F1B06170101"と表示させたいのですがどう書けばよろしいでしょうか
>
> の変換法則を言語化してもらう必要があります。

と書きましたが、せめて何がしたいのかを書けませんか?

例えば、

"3646 3142 3036 3137 3031 3031 0000\r\0" と言う文字列の中の 36 46 31 42 30 36 ...
は 16 進数の ASCII コード(Shift_JIS ?)。それらに対応する文字 6 F 1 B 0 6 ... か
らなる文字列 "6F1B06170101" を取得したい。

ASCII, Shift_JIS コードと言うのが何だかわからなければググれば参考になる記事がヒッ
トします。例えば下記:

ASCIIコード表
https://e-words.jp/p/r-ascii.html

文字コード表 シフトJIS(Shift_JIS)
http://charset.7jp.net/sjis.html

引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -