質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

4回答

12745閲覧

[C#]char配列 → Stringへの変換時に'\0'が入るのを消したい

Mentol

総合スコア33

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2016/10/08 07:15

###前提・実現したいこと
Tcp経由で文字をNetworkStreamで取得し、取得した文字の操作を行いたいです。
取得した文字を操作する際に、操作の利便性を考えてchar配列からStringへの変換を行おうと思いました。
その際、'\0'文字が入ってしまい、思ったような操作ができなくて困っています。

###ソース

c#

1using (var stream = client.GetStream()) 2using (var reader = new StreamReader(stream)) 3{ 4 const int bufferSize = 1024; 5 char[] temp = new char[bufferSize]; 6 reader.Read(temp, 0, bufferSize); 7 8 var str = new String(temp); 9}

この時のstrに'\0'が入ります。

###ためしたこと

C#

1str.Replace("\0", "");

このような置き換えはきいてくれませんでした。

検索してみてもいまいち見つからず。。。

###最後に
char配列をループで回して、1文字ずつ処理するしかないのでしょうか?

よろしくおねがいします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

'¥0'が入ってしまうという以前に、電文フォーマットの設計の仕方に問題があります。

問題は、「受信する文字列の長さ(charの数)がわからない状態で文字列を受信しようとしている」ことです。
だから1024文字という恣意的な長さの配列を用意して受け取らざるを得なくなり、それより短い文字列を受信したときには配列の後半が'¥0'で埋められてしまうという結果になっています。

ストリーム通信において文字列のような不定長データを送受信するときには定石があり

  • まず文字列長を送る(4バイト整数なんかで)
  • 文字列本体を送る

です。
これなら受信側は文字列長ぴったりの分だけバッファを用意してそこにデータを受け取れます。

投稿2016/10/08 07:36

yuba

総合スコア5568

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Mentol

2016/10/08 07:38

ほぉ!!! なるほどです。 ありがとうございます!
guest

0

Readの戻り値を利用するのは駄目なんでしょうか?

C#

1var readSize = reader.Read(temp, 0, bufferSize); 2var str = new String(temp, 0, readSize);

投稿2016/10/08 07:42

raccy

総合スコア21735

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

置き換えでいいなら
str.TrimEnd('\0');
でどうでしょう

投稿2016/10/08 07:34

hihijiji

総合スコア4150

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Mentol

2016/10/08 07:36

結果を代入してなかっただけでした。 もうしわけないです
guest

0

ベストアンサー

C#

1str.Replace("\0", "");

上記で少なくとも文字列中のNULL文字(値0の文字)は全て削除された文字が取得できるはずです。
※結果をstrに代入していませんのでstrの値自体は変更されません。

投稿2016/10/08 07:33

nakit

総合スコア410

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Mentol

2016/10/08 07:35

あ。。。 すみませんでしたあああああ。。。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問