2014-10-31 18 views
5

Bilgileri gönderen ve alan bir UDP sunucusuna/istemcisine sahibim. Client sunucuya örnek "TEST" gönderecektir, sunucudizi gösterimi içinde "TEST" alır vekurucuyu kullanarak String dönüştürür. Sonra equalsIgnoreCase yöntemini kullanarak başka bir dize karşı alınan yeni String karşılaştırmak gerekir.Byte Array ile String arasında dönüştürme ve başka bir String (java) ile karşılaştırma

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 

herhangi bir fikir: Ama burada

benim kod örneği verilmiştir ... Çalışmıyor mu?

+1

Ne çalışmıyor? İstisna, beklenen gerçek çıktı mı? – BetaRide

+0

System.out.println ("ALINAN:" + cümle) "nedir? –

+0

System.out.println ("BAŞVURU:" + cümle) "ALINMIŞTIR: TEST" yazdıracak Ama "TEST" karşı cümlesini karşılaştırırken sonuç yanlış –

cevap

5

ama bir şey gibi öncelikle cümle nesneyi yazdırmak. en olası dizeleri şunlardır:

  • " TEST" veya

  • "TEST\n""TEST " Ama istemci ip veya sunucu kodu ya bir homoglyph olması da mümkündür. Özellikle, (0,4) sentence.substring, bunun bir alt alırsak Tamam yüzden sadece sentence.length kullanarak öğrendim


    () bu cümle ... 1024 karakter uzunluğundadır.

    Ah. Yani sorun (muhtemelen) alınan paketin boyutunu görmezden geliyorsunuz ve dizideki tüm arabellek dizisini dahil ediyor.

    dize ayıklamak için en doğru yoludur:

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

    ... Ben ofset önceki ifadeleri göz önüne alındığında, sıfır olacak düşünüyorum gerçi.

    (Ayrıca, istemcinin NUL baytını göndermesi de mümkündür ... bu durumda, istemci tarafında da bir şeyler değiştirmeniz gerekir.)

  • +0

    Alright, bu yüzden 'sentence' olan' sentence.length() 'yi kullanarak öğrendim. 1024 karakter uzunluğunda ... eğer bir alt dizgi alırsam, özellikle de 'sentence.substring (0,4)' karşılaştırması bana doğruyu verir. –

    +0

    Örneğin "TEST" kelimesinden önce veya sonra bu ekstra boş karakterleri kesmenin herhangi bir yolu var mı? –

    +0

    _DatagramPacket.getOffset() _ ve _DatagramPacket.getLength() _ yöntemlerine bakın. – McDowell

    1

    bu şekilde yerine veri alma edecek Kodunuzda

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

    ait

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

    gibi dize nesne oluşturun ama çok ekstra içerik var. Örneğin, paket nesnesinden okuyacak olan setData boyutunun 10'a ayarlanması. Şimdi "Test" için, getData'nızda 4 blok ve bloğun geri kalanı kullanılacaktır, yani 6, null, hepsi de cümlenin nesnesinde kullanılacaktır. Bu yüzden cümle eşleşmeyecektir. test için

    sadece bunu göstermek zaman "TEST" benziyor bu en olası açıklama sentence dize "TEST" olmadığıdır şekilde

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

    'System.out.println (msg)' bana TEST veriyor, ancak msg' ile "TEST" arasındaki karşılaştırma hala yanlış –

    0

    "TEST " ve "TEST" eşit değildir. Dize uzunluğunu doğrulayın.

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

    kullanılarak boşluk kaldırmak için:

    sentence = sentence.trim(); 
    
    +0

    'trim' komutunu denediniz, yine de 1024 karakter dizgisini döndürüyor –

    1

    I ReceiveData uzun 4'e göre olduğunu düşünüyorum, yani arka bayt da dönüştürülmüş String ihtiva edilmektedir. Yeni String'inizde takip eden baytları (bayt 0) kesmeniz gerekir. Java tutorial kullanımdan

    0

    :

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

    alınan pakette gelen dize almak için; Sizin durumunuzda olacak:

    String sentence = new String(receivePacket.getData(), 0, receivePacket.getLength()); 
    
    İlgili konular