[英]Convert from Byte Array to String and compare against another String (java)
我有一個UDP服務器/客戶端,可以發送和接收信息。 Client
將示例"TEST"
發送到服務器,服務器將以byte[]
數組表示形式接收"TEST"
,並使用String(byte[])
構造函數將其轉換為String
。 然后,我需要使用equalsIgnoreCase
方法將接收到的新String
與另一個字符串進行equalsIgnoreCase
。 但它不起作用......
這是我的代碼示例:
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
有任何想法嗎?
最可能的解釋是sentence
中的字符串不是"TEST"
而是顯示它時看起來像 "TEST"
東西。 最可能的字符串是:
" TEST"
或"TEST "
"TEST\\n"
但是也可能在客戶端字符串或服務器代碼中都有一個同形字符。
好吧所以我剛發現使用了句子。長度為1024個字符的句子...如果我取一個子串,特別是sentence.substring(0,4)。
啊。 所以問題是(可能)你忽略了接收數據包的大小,並在字符串中包含了整個緩沖區數組。
提取字符串的最正確方法是:
new String(receivePacket.getData(),
receivePacket.getOffset(),
receivePacket.getLength(), "UTF-8");
......雖然我認為根據之前的陳述,偏移量將為零。
(但客戶端也可能正在發送NUL字節......在這種情況下,您還需要在客戶端更改內容。)
像這樣創建字符串對象
String msg = new String(receiveData, 0, receivePacket.length);
代替
String sentence = new String(receivePacket.getData(), "UTF-8");
在您的代碼中將獲取數據,但它也有額外的內容。 例如,在您的receiveData大小設置為10時,將從您的數據包對象中讀取。 現在,對於“Test”,它將在你的receiveData中使用4個塊,其余的塊,即6個為null,這樣所有都將在你的句子對象中使用。 這就是為什么句子不匹配。
對於測試,只需像這樣打印您的句子對象
Log.e("Sentence",""+sentence);
我認為receiveData長於4,因此尾隨字節也包含在轉換后的String中。 新String時應該切斷尾隨字節(字節0)。
"TEST "
和"TEST"
不相等。 驗證字符串長度。
System.out.println(sentence.length());
要刪除空格:
sentence = sentence.trim();
從Java教程使用:
String received = new String(packet.getData(), 0, packet.getLength());
從收到的數據包中獲取字符串; 在你的情況下,你將有:
String sentence = new String(receivePacket.getData(), 0, receivePacket.getLength());
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.