2014-10-31 8 views
5

Mam serwer/klient UDP, który wysyła i odbiera informacje. Client wyśle ​​na serwer przykład "TEST", serwer otrzyma "TEST" w reprezentacji tablic byte[] i skonwertuje ją na String przy użyciu konstruktora String(byte[]). Następnie muszę porównać nowy String otrzymany z innym ciągiem przy użyciu metody equalsIgnoreCase. Ale to nie działa ...Konwertuj z tablicy bajtowej na ciąg i porównaj z innym ciągiem znaków (java)

Oto próbka mojego kodu:

DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); 
serverSocket.receive(receivePacket); 
//Client sent "TEST" 
String sentence = new String(receivePacket.getData(), "UTF-8"); 
System.out.println("RECEIVED: " + sentence); 
System.out.println(sentence.equalsIgnoreCase("TEST")); //This gives me FALSE 

Jakieś pomysły?

+1

Co nie działa? Wyjątek, oczekiwany a rzeczywisty wynik? – BetaRide

+0

Co znaczy "System.out.println (" RECEIVED: "+ sentence); print? –

+0

System.out.println ("RECEIVED:" + zdanie) wyświetli "RECEIVED: TEST" Ale przy porównywaniu zdania z "TEST" wynik jest fałszywy –

Odpowiedz

5

Najbardziej prawdopodobnym wyjaśnieniem jest to, że ciąg w sentence nie jest "TEST" ale coś, co wygląda jak "TEST" gdy ją wyświetlić. Najbardziej prawdopodobne ciągi są:

  • " TEST" lub "TEST "
  • "TEST\n"

Ale jest też możliwe, że masz homoglyph albo ciąg klienta lub kodzie serwera.


Dobrze więc po prostu okazało się, używając sentence.length(), które zdanie jest długa 1024 znaków ... jeśli biorę podciąg z niego, a konkretnie sentence.substring (0,4).

Ah. Problem polega więc (prawdopodobnie) na ignorowaniu rozmiaru odebranego pakietu i włączeniu całej tablicy buforów do łańcucha.

najbardziej poprawny sposób wyodrębnić ciąg jest:

new String(receivePacket.getData(), 
      receivePacket.getOffset(), 
      receivePacket.getLength(), "UTF-8"); 

... choć myślę, że przesunięcie będzie wynosić zero, biorąc pod uwagę wcześniejsze wypowiedzi.

(Ale możliwe jest również, że klient wysyła bajty NUL ... w takim przypadku trzeba będzie również zmienić ustawienia po stronie klienta.)

+0

Dobrze, więc właśnie dowiedziałem się używając' sentence.length() ', że' zdanie' jest 1024 znaki długie ... jeśli wezmę podłańcuch, konkretnie 'sentence.substring (0,4)' porównanie daje mi prawdę. –

+0

Czy można wyciąć wszystkie dodatkowe puste znaki po lub przed słowem "TEST"? –

+0

Sprawdź metody _DatagramPacket.getOffset() _ i _DatagramPacket.getLength() _. – McDowell

1

Tworzenie obiektu ciąg jakby ten sposób

String msg = new String(receiveData, 0, receivePacket.length); 

zamiast

String sentence = new String(receivePacket.getData(), "UTF-8"); 

w kodzie będzie uzyskiwanie danych, ale mają dodatkową zawartość zbyt. Na przykład w twoim receiveData rozmiar ustawiony na 10, który będzie czytał z twojego obiektu pakietu. Teraz dla "Test" będzie używał 4 bloków w twoich wynikach odbioru, a reszta bloku, czyli 6, będzie pusta, tak że wszystkie będą używane również w obiekcie zdania. To dlatego zdanie nie pasuje.

Do testu po prostu wydrukować swój przedmiot zdanie pierwsze jak ten sposób

Log.e("Sentence",""+sentence); 
+0

'System.out.println (msg)' daje mi TEST, ale porównanie pomiędzy 'msg' i" TEST "są fałszywe nadal –

0

"TEST " i "TEST" nie są równe. Zweryfikuj długość ciągu.

System.out.println(sentence.length()); 

celu usunięcia miejsc z:

sentence = sentence.trim(); 
+0

Wypróbowałem polecenie "trim", wciąż zwraca 1024 ciąg znaków –

1

myślę receiveData jest większa niż 4, to końcowe bajty są również zawarte w przebudowanej ciąg. Powinieneś odciąć końcowe bajty (bajt 0), kiedy masz nowy ciąg.

0

Od Java tutorial użytku:

String received = new String(packet.getData(), 0, packet.getLength()); 

uzyskać ciąg z odebranego pakietu; w twoim przypadku będziesz mieć:

String sentence = new String(receivePacket.getData(), 0, receivePacket.getLength()); 
Powiązane problemy