1

私は C# で小さなソケット アプリケーションを作成しました。このアプリケーションは、起動時にプログラムの現在のバージョンをチェックします。現在、このテスト プログラムでは、すべてが機能します。サーバーから文字列を送信すると、クライアントに適切に表示されます。 、しかし、その文字列で if ステートメントを使用しようとすると、機能しません。例:

    public void rcv(NetworkStream ns, TcpClient clientSocket)
    {
        on = false;
    //sending some random string so the server will respond
       Byte[] sendBytes = Encoding.ASCII.GetBytes("bla");
        ns.Write(sendBytes, 0, sendBytes.Length);
    //receiving server response 
        byte[] bytes = new byte[clientSocket.ReceiveBufferSize];
        int bytesread = clientSocket.ReceiveBufferSize;
        ns.Read(bytes, 0, bytesread);
    //received response, now encoding it to a string from a byte array
        string returndata =Encoding.ASCII.GetString(bytes);
        ver = Convert.ToString(returndata);
        //MessageBox.Show("ver\n" + ver);
        //MessageBox.Show("return\n" + returndata);
        on = true;
        if (ver== "2.0.1")
        {
            MessageBox.Show("iahsd");
        }
    }

ご覧のとおり、サーバーから送信されているテスト文字列「2.0.1」は、テスト用に入力したラベル、メッセージボックス、およびテキストボックスに正しく表示されます。しかし、クラスの最後のifブランチはそれを受け入れずにスキップします。elseステートメントを入れると、そこにスキップします。

私と私の友人が考えることができるすべてを試し、エンコーディングを変更してみました、別の文字列を送信しました..

クライアントの完全なコード: http://pastebin.com/bQPghvAH

4

2 に答える 2

1

コードでコンパイルされた「2.0.1」は、Unicode として保存されます。 http://msdn.microsoft.com/en-us/library/362314fe(v=vs.110).aspx

サーバーからの値を ASCII エンコードされたテキストとして扱い、それを Unicode 文字列と比較しています。

観察:

    static void Main(string[] args)
    {
        string a = "hello";
        byte[] b = UnicodeEncoding.Unicode.GetBytes(a);
        string c = ASCIIEncoding.ASCII.GetString(b);

        Console.WriteLine(a == c);
    }

解決策は、String.Compare... を使用することです。

Console.WriteLine(String.Compare(a,c)==0);
于 2012-11-16T13:25:09.180 に答える
1

Stream.Read(...)読み取ったバイト数を返します。オーバーロードを使用して、この値を使用して文字列が終了する場所を特定する必要がありますEncoding.GetString(Byte[] bytes, Int32 index, Int32 count)

Byte[] buffer = ...;
var bytesRead = stream.Read(buffer, 0, buffer.Length);
var returnedData = Encoding.ASCII.GetString(buffer, 0, bytesRead);
于 2012-11-16T13:34:33.063 に答える