2014-10-31 21 views
5

Tôi có một máy chủ/máy khách UDP gửi và nhận thông tin. Client sẽ gửi ví dụ "TEST" tới máy chủ, máy chủ sẽ nhận được "TEST" trong biểu diễn mảng byte[] và chuyển đổi nó thành String bằng cách sử dụng hàm tạo String(byte[]). Sau đó, tôi cần so sánh số String mới nhận được với một chuỗi khác bằng phương thức equalsIgnoreCase. Nhưng nó không làm việc ...Chuyển đổi từ Byte Array thành String và so sánh với một Chuỗi khác (java)

Dưới đây là một mẫu mã của tôi:

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 

Bất kỳ ý tưởng?

+1

Điều gì không hoạt động? Ngoại lệ, dự kiến ​​so với đầu ra thực tế? – BetaRide

+0

'System.out.println (" RECEIVED: "+ câu);' print là gì? –

+0

System.out.println ("RECEIVED:" + sentence) sẽ in "RECEIVED: TEST" Nhưng khi so sánh câu với "TEST", kết quả là false –

Trả lời

5

Lời giải thích khả năng nhất là các chuỗi trong sentence không phải là "TEST" nhưng cái gì đó trông giống như "TEST" khi bạn hiển thị nó. Các chuỗi có khả năng nhất là:

  • " TEST" hoặc "TEST "
  • "TEST\n"

Nhưng nó cũng có thể là bạn có một homoglyph trong cả hai chuỗi khách hàng, hoặc mã máy chủ của bạn.


Được rồi vì vậy tôi chỉ phát hiện ra sử dụng sentence.length() câu đó là dài 1.024 ký tự ... nếu tôi tham gia một chuỗi con của nó, đặc biệt là sentence.substring (0,4).

Ah. Vì vậy, vấn đề là (có thể) rằng bạn đang bỏ qua kích thước của gói tin nhận được, và bao gồm toàn bộ mảng đệm trong chuỗi.

Cách đúng nhất để trích xuất các chuỗi là:

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

... mặc dù tôi nghĩ rằng bù đắp sẽ là không, vì các báo cáo trước đó.

(Nhưng cũng có thể khách hàng đang gửi các byte NUL ... trong trường hợp đó, bạn cũng sẽ cần thay đổi mọi thứ ở phía máy khách.)

+0

Được rồi vì vậy tôi vừa phát hiện ra bằng cách sử dụng' sentence.length() 'mà' câu' là Dài 1024 ký tự ... nếu tôi lấy một chuỗi con của nó, cụ thể là 'sentence.substring (0,4)' so sánh cho tôi sự thật. –

+0

Bất kỳ cách nào để cắt bỏ tất cả các ký tự trống thừa sau hoặc trước từ "TEST" chẳng hạn? –

+0

Kiểm tra các phương thức _DatagramPacket.getOffset() _ và _DatagramPacket.getLength() _. – McDowell

1

Tạo đối tượng chuỗi như cách này

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

thay vì

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

Trong code của bạn sẽ nhận được dữ liệu nhưng nó có thêm nội dung quá. Ví dụ trong kích thước receiveData của bạn được đặt thành 10 sẽ được đọc từ đối tượng gói của bạn. Bây giờ cho "Test" nó sẽ được sử dụng 4 khối trong receiveData của bạn và phần còn lại của khối tức là 6 là null để tất cả sẽ được sử dụng trong đối tượng câu của bạn quá. Đó là lý do tại sao câu sẽ không khớp.

Đối với bài kiểm tra chỉ cần in đối tượng câu của bạn đầu tiên như cách này

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

'System.out.println (msg)' đang cho tôi TEST, nhưng so sánh giữa 'msg' và" TEST "là false vẫn là –

0

"TEST ""TEST" không bằng nhau. Xác minh độ dài chuỗi.

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

Để loại bỏ các không gian sử dụng:

sentence = sentence.trim(); 
+0

Đã thử lệnh 'trim', vẫn trả về chuỗi ký tự 1024 –

1

Tôi nghĩ receiveData dài hơn 4, vì vậy byte trailing cũng được chứa trong chuỗi chuyển đổi. Bạn nên cắt bỏ các byte sau (byte 0) khi bạn mới String.

0

Từ Java tutorial sử dụng:

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

để có được chuỗi từ nhận gói; trong trường hợp của bạn, bạn sẽ có:

String sentence = new String(receivePacket.getData(), 0, receivePacket.getLength()); 
Các vấn đề liên quan