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

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

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

Re[5]: Linuxから送られてくる文字列がC#で文字化けする


(過去ログ 138 を表示中)

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

■81445 / inTopicNo.1)  Linuxから送られてくる文字列がC#で文字化けする
  
□投稿者/ PI (1回)-(2016/09/23(Fri) 14:19:34)

分類:[C#] 

【Linux(RaspBerry Pi)から送られてくる文字列がWindows(C#プログラム)で文字化けする】

現在、RaspBerry Piで取得した値をソケット通信で
Windows上で動くアプリ(C#)に表示させることを目指しています。


RaspBerry Pi側でソケット通信により下記コードでbufをWindows側に送ります。

-------------------------------------------
sprintf(buf,"%02d%02d\n",data1,data2);
write(dstSocket, buf, 1024);
-------------------------------------------

Windows側で上記の送られてきたデータを読み取って、表示させたのですが
表示させたdataは文字化けしています。(他のエンコードを試しても文字化けしていました)

-------------------------------------------
NetworkStream stream = client.GetStream();

Byte[] bytes = new Byte[50];
int i;

//メッセージを受信
while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
{
String data = System.Text.Encoding.UTF8.GetString(bytes, 0, i);
}
-------------------------------------------

上記の文字化けを解消する方法を教えてください。
引用返信 編集キー/
■81446 / inTopicNo.2)  Re[1]: Linuxから送られてくる文字列がC#で文字化けする
□投稿者/ Hongliang (459回)-(2016/09/23(Fri) 14:44:48)
2016/09/23(Fri) 15:03:52 編集(投稿者)

> sprintf(buf,"%02d%02d\n",data1,data2);
> write(dstSocket, buf, 1024);

終端文字を入れても6バイト分のデータのようですが、なぜ1024バイト書き込んでるんでしょうか?
<訂正>あ、最大で22バイトぐらいにはなりますね。</訂正>

文字化けした結果、どういう文字列になっていますか?
その文字列をどうやって確認しましたか?
先頭4バイト分だけ見ればdata1, data2の数値が出ていたりしませんか?
引用返信 編集キー/
■81447 / inTopicNo.3)  Re[2]: Linuxから送られてくる文字列がC#で文字化けする
□投稿者/ むぅ (11回)-(2016/09/23(Fri) 14:48:35)
エンディアンの問題ではないですかね?^^

ARMはバイエンディアンとありましたが・・・。
引用返信 編集キー/
■81448 / inTopicNo.4)  Re[3]: Linuxから送られてくる文字列がC#で文字化けする
□投稿者/ PI (2回)-(2016/09/23(Fri) 15:31:57)
ご回答有難うございます。

Hongliangさん
・表示された文字列は「8&#65533;&#65533;v&#65533;r&#65533;v」となっています。
  ⇒表示させたい値は「2755」となるはずです。(ラズパイで計測した温度と湿度の数値を送っています)

・表示方法はString dataの内容をTextBoxに表示させて確認しました。
⇒textBox1.Text = data;

むぅさん
 > ARMはバイエンディアンとありましたが・・・。
 そちらについても調べてみます。
引用返信 編集キー/
■81449 / inTopicNo.5)  Re[4]: Linuxから送られてくる文字列がC#で文字化けする
□投稿者/ とっちゃん (401回)-(2016/09/23(Fri) 16:37:24)
No81448 (PI さん) に返信

> ・表示された文字列は「8&#65533;&#65533;v&#65533;r&#65533;v」となっています。
>   ⇒表示させたい値は「2755」となるはずです。(ラズパイで計測した温度と湿度の数値を送っています)
>

送信側の
write(dstSocket, buf, 1024);
と、固定1024バイトで送信部分を

write(dstSocket, buf, strlen(buf) );
または
write(dstSocket, buf, strlen(buf)+1 );

と可変長にしてみてはいかがでしょうか?

もし、固定長で送る必要があるなら、
sprintf の前に memset( buf, 0, 1024 );

とするなど、データを0リセットしておくか(誤動作低減のため)
終端文字コードが出て以降は処理しないような工夫(ループしているのでそれなりの工夫が必要です)をする必要があると思います。

引用返信 編集キー/
■81450 / inTopicNo.6)  Re[5]: Linuxから送られてくる文字列がC#で文字化けする
□投稿者/ PI (3回)-(2016/09/23(Fri) 16:44:53)
No81449 (とっちゃん さん) に返信
> ■No81448 (PI さん) に返信
>
>>・表示された文字列は「8&#65533;&#65533;v&#65533;r&#65533;v」となっています。
>>  ⇒表示させたい値は「2755」となるはずです。(ラズパイで計測した温度と湿度の数値を送っています)
>>
>
> 送信側の
> write(dstSocket, buf, 1024);
> と、固定1024バイトで送信部分を
>
> write(dstSocket, buf, strlen(buf) );
> または
> write(dstSocket, buf, strlen(buf)+1 );
>
> と可変長にしてみてはいかがでしょうか?
>
> もし、固定長で送る必要があるなら、
> sprintf の前に memset( buf, 0, 1024 );
>
> とするなど、データを0リセットしておくか(誤動作低減のため)
> 終端文字コードが出て以降は処理しないような工夫(ループしているのでそれなりの工夫が必要です)をする必要があると思います。
>



とっちゃん さん
ご回答有難うございます。
write(dstSocket, buf, strlen(buf)+1 );とすることで期待通りの表示をすることが可能となりました。

回答してくださった皆様有難うございます。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -