簡體   English   中英

從字節數組轉換為字符串並與另一個字符串(java)進行比較

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM