Problem z konwertowaniem z Byte[] na String.

0

Witam. Konwertowałem juz wiele razy, ale takiego błędu w życiu nie widziałem :/. Podaję kod:

TcpListener t = new TcpListener(er);
            t.Start();
            TcpClient tt = t.AcceptTcpClient();
            NetworkStream nff = tt.GetStream();
            Byte[] yesorno = new Byte[32];
            while (true)
            {
                if (nff.DataAvailable)
                {
                    nff.Read(yesorno, 0, 32);
                    break;
                }
            }
            string yesno = Encoding.Unicode.GetString(yesorno);
            if (yesno == "Valid")
            {
                MessageBox.Show("Prawidłowe dane.", "Logowanie", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            else if ("Invalid" == yesno)
            {
                MessageBox.Show("Nieprawidłowe dane!", "Logowanie", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

Widać, że odbieram w nim dane, które informują klienta, czy dane przedstawione przez niego są prawidłowe. Niestety, gdy podaję prawidłowe dane (wiem, bo bawiłem się tu MessageBox i wyświetlałem przysłaną zawartość), wartość zmiennej yesno wynosi "Valid", jednak yesno nie jest równe "Valid" :/. Gdy kombinowałem troszkę, to mnie jedno zdziwiło:

MessageBox.Show(yesno + "|");
MessageBox.Show("Valid" + "|");

Po pierwszej komendzie powinno zwrócić nam komunikat z tekstem "Valid|", jednak zwraca "Valid", a przy drugiej komendzie "Valid|". Wie ktoś co się za tym kryje?? Możliwe, że to przez za dużą ilość zmiennych w tabeli yesorno?

P.S.: Zauważyłem przed chwilą, że jak mam komendę:

MessageBox.Show(yesno + "Valid");

To zwraca tylko samo "Valid" :/.

0

wczytujesz 32 bajty. zgaduję, że yesno ma długość 32, a powyżej napisu "valid" zawiera zera ('\x0'). przytnij długość napisu do ilości faktycznie wczytanych danych (zwaca Ci to metoda Read()).

0

Widać, że odbieram w nim dane
ale nie widać jak wysyłasz.

0

Proszę:

            try
            {
                StreamReader sr = new StreamReader("D:\\DANE\\USERS\\" + log + ".txt");
                string sd = sr.ReadLine();
                if (sd == password)
                {

                }
                else
                {
                    TcpClient t = new TcpClient();
                    t.Connect("localhost", 1234);
                    NetworkStream nf = t.GetStream();
                    Byte[] error = Encoding.Unicode.GetBytes("Invalid");
                    nf.Write(error, 0, error.Length);
                    MessageBox.Show("Error");
                    return;
                }
            }
            catch (Exception)
            {
                TcpClient t = new TcpClient();
                t.Connect("localhost", 1234);
                NetworkStream nf = t.GetStream();
                Byte[] error = Encoding.Unicode.GetBytes("Invalid");
                nf.Write(error, 0, error.Length);
                MessageBox.Show("Error");
                return;
            }

Jednak na razie stosuję swój "protokół" do rozdzielania danych. Jednak jak są jakieś inne pomysły, to proszę o podawanie :).

0

Po odebraniu danych w serwerze ten string ma wartośc "Invalid\0\0\0\0\0". Po zrobieniu poniższej zmiany działa poprawnie.

                        Int32 port = 13001;
			IPAddress localAddr = IPAddress.Parse("127.0.0.1");

			TcpListener t = new TcpListener(localAddr, port);
			t.Start();
			TcpClient tt = t.AcceptTcpClient();
			NetworkStream nff = tt.GetStream();
			Byte[] yesorno = new Byte[32];
			int bytesRead = 0;
			while (true)
			{
				if (nff.DataAvailable)
				{
					bytesRead = nff.Read(yesorno, 0, 32);
					break;
				}
			}

			Byte[] buff = new Byte[bytesRead];
			Array.Copy(yesorno, 0, buff, 0, bytesRead);

			string yesno = Encoding.Unicode.GetString(buff);
			if (yesno == "Valid")
			{
				//MessageBox.Show("Prawidłowe dane.", "Logowanie", MessageBoxButtons.OK, MessageBoxIcon.Information);
				System.Console.WriteLine("Prawidłowe dane.");
			}
			else if ("Invalid" == yesno)
			{
				//MessageBox.Show("Nieprawidłowe dane!", "Logowanie", MessageBoxButtons.OK, MessageBoxIcon.Error);
				System.Console.WriteLine("Nieprawidłowe dane.");
			}

			tt.Close();

EDIT:

zamiast tworzyć dodatkowy bufor można (właśnie doczytałem w MSDN) użyć przeciążonej metody GetString():

string yesno = Encoding.Unicode.GetString(yesorno, 0, bytesRead);

wtedy też działa. Czyli kod wygląda tak:

                        Int32 port = 13001;
			IPAddress localAddr = IPAddress.Parse("127.0.0.1");

			TcpListener t = new TcpListener(localAddr, port);
			t.Start();
			TcpClient tt = t.AcceptTcpClient();
			NetworkStream nff = tt.GetStream();
			Byte[] yesorno = new Byte[32];
			int bytesRead = 0;
			while (true)
			{
				if (nff.DataAvailable)
				{
					bytesRead = nff.Read(yesorno, 0, 32);
					break;
				}
			}

			string yesno = Encoding.Unicode.GetString(yesorno, 0, bytesRead);

			if (yesno == "Valid")
			{
				//MessageBox.Show("Prawidłowe dane.", "Logowanie", MessageBoxButtons.OK, MessageBoxIcon.Information);
				System.Console.WriteLine("Prawidłowe dane.");
			}
			else if ("Invalid" == yesno)
			{
				//MessageBox.Show("Nieprawidłowe dane!", "Logowanie", MessageBoxButtons.OK, MessageBoxIcon.Error);
				System.Console.WriteLine("Nieprawidłowe dane.");
			}

			tt.Close();
0
                        while (true)
                        {
                                if (nff.DataAvailable)
                                {
                                        bytesRead = nff.Read(yesorno, 0, 32);
                                        break;
                                }
                        }

litości! dodaj sleep chociaż na kilka ms, w przeciwnym wypadku całkowicie niepotrzebnie zasrasz jeden rdzeń procesora.

1 użytkowników online, w tym zalogowanych: 0, gości: 1