2009-06-17 15 views
0

私はこのコードを使ってtcpclientからいくつかの文字列を返していますが、文字列が戻ってくるときには先頭に"文字が含まれています。私はそれを削除しようとしているが、Len()関数は文字列そのものの代わりにバイト数を読み込んでいます。これを変更して、文字列の長さを、文字列そのものの配列ではなく、通常は使用するようにすることはできますか?VB.NETでASCII文字列の長さ(文字数)を取得するにはどうすればよいですか?

Dim bytes(tcpClient.ReceiveBufferSize) As Byte 
networkStream.Read(bytes, 0, CInt(tcpClient.ReceiveBufferSize)) 

' Output the data received from the host to the console.' 
Dim returndata As String = Encoding.ASCII.GetString(bytes) 

Dim LL As Int32 = Len(returndata) 

Len()は、文字列の文字数ではないバイト数を報告します。

+0

LENが動作するはずです。個々の文字/バイトを見てそこに実際に何が入っているのかを知りたいかもしれません。 – RBarryYoung

答えて

5

あなたのコードは現在多少壊れています。あなたがnetworkStream.Readからの戻り値を無視しているので、実際にどれくらいのデータを受け取ったかにかかわらず、答えはtcpClient.ReceiveBufferSizeで、実際にはが届きました。それはちょうど数バイトを返すかもしれませんが、とにかくbytes配列の残りを使って文字列を作成しています。 常に戻り値Stream.Readを確認します。そうしないと、実際に読み取られたデータの量がわからないからです。あなたが何か行う必要があります。

Dim bytesRead = networkStream.Read(bytes, 0, CInt(tcpClient.ReceiveBufferSize)) 

' Output the data received from the host to the console.' 
Dim returndata As String = Encoding.ASCII.GetString(bytes, 0, bytesRead) 

を、ASCIIは常に単一バイト当たりの文字(またはその逆)を持っているので、文字列の長さは、あなたが受信したデータの長さと全く同じになります。

ASCII以外のデータ(127以上の任意のバイト)は「?」に変換されることに注意してください。 by Encoding.ASCII.GetString。制御文字を取得することもできます。これは間違いなくASCIIテキストデータで始まるのですか?そうでない場合は、16進数でエンコードするか、他のオプションを使用して正確なデータを非ロスでダンプすることをお勧めします。

0

あなたはレンの呼び出し()内の文字列をトリミング試みることができる:レンは、バイト数を報告し、それが文字の数と一致しない場合、私は二つの可能性を考えることができ

Dim LL As Int32 = Len(returndata.Trim()) 
+0

はうまくいかず、私はそれを試しました。 – Middletone

0

  • あなたは(すなわち、余分な文字が実際に送信されていること)

  • エンコーディングはASCIIではないので、考えるより送信されている多くの文字があります。 reは1文字につき2バイト以上にすることができます(そのうちの1つは「奇妙な」文字です。つまり、文字が送信されていて、「間違ったデータ」ではありません)。データが実際にASCIIエンコードされているかどうかを調べてください。そうでない場合は、それに応じてコールを変更してください。

0

正しく読んだら、冒頭に一重引用符が表示されます。そうですか?

もしあなたが一貫してそれを得るなら、文字列の長さから1を引くだけではないのですか?または第二の文字から部分文字列を使用します。

Len(returndata.Substring(1) 

そして、私は非常に私は通常、自身が«文字列の基礎となる配列のそれを使用していないと同じように、あなたが文字列の長さ»と意味を理解していません。あなたには文字列があります。その文字列を内部的に表す可能性のある配列は、すべて実装依存であり、参照する必要はありません。それともあなたがここで間違っているのですか?文字列は通常使用しているです。つまり、あなたが何をしているのでなければ、の文字列の長さをのように処理して、普通に使ってしまうのですか?

0

多分私はここに何かが欠けているかもしれませんが、String.Lengthで何が間違っていますか?

Dim LL As Int32 = returndata.Length 
+0

何もありませんが、Lenと全く同じです – MarkJ

関連する問題