C# После отправки строки через Networkstream ее можно прочитать, но она не работает с "если"

Я написал небольшое приложение для сокетов на 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

2 ответа

"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);

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);
Другие вопросы по тегам