2015-05-08 73 views
1

我目前正在編寫一個多人遊戲,而且我現在正在聯網這方面工作。我建立了一個數據包系統,它的工作方式(至少使用字符串)是,它需要多個字符到最多的「X」字符。字符被轉換爲字節發送到服務器。如果少於X個字符,則其餘字節設置爲0.問題是,在服務器上處理此信息並將其轉換爲字符串時,我的控制檯中的0字節字符爲'□',並且在我的JTextPane中不可見。如何以乾淨的方式從字符串中刪除所有這些0字節的字符?我寧願不要有另一個循環和更多的變量只是爲了在轉換爲字符串之前刪除0字節。沒有人喜歡骯髒的代碼。 :P刪除字符串中的0字節(UTF-8)字符

分組數據:

03100101118000000000971001091051100000000 
  • 03 =數據包ID(不相關)
  • 100101118000000000 =用戶名( 「開發」)
  • 971001091051100000000 =密碼( 「管理員」)

結果字符串:

  • usernameString = 「開發□□□□□□□□□」
  • passwordString = 「管理員□□□□□□□」

我已經試過:

usernameString.replaceAll(new String(new byte[] {0}, "UTF-8"), ""); 
passwordString.replaceAll(new String(new byte[] {0}, "UTF-8"), ""); 

但是,這並沒有改變字符串。

+0

使用一些正則表達式來串的數學端爲一個或多個'0' –

+1

如果您正在使用Java 7或更高版本,最好使用「StandardCharsets.UTF_8」常量而不是「UTF-8」文字。這是更快的,你不需要處理/重新拋出UnsupportedEncodingException。 –

+0

@TagirValeev哇我從來沒有意識到'StandardCharsets.UTF_8'與''UTF-8''文字相比有多快。萬分感謝。 – TheNewGuy

回答

3

您的所有零點出現在字符串的結尾就可以解決這個問題,即使沒有正規expresions:

static String trimZeros(String str) { 
    int pos = str.indexOf(0); 
    return pos == -1 ? str : str.substring(0, pos); 
} 

usernameString = trimZeros(usernameString); 
passwordString = trimZeros(passwordString); 
+1

我比普通表達式更喜歡這個,假設'0'只出現在最後。 – Radiodef

+1

好的補充,謝謝。編輯。 –

+0

@TagirValeev由於數據包的性質,除非末尾沒有填充字符,否則不會有0字節。儘管這是一個很好的安全預防措施。 – TheNewGuy

2
usernameString = // replace 1 or more \0 at the end of the string 
    usernameString.replaceAll("\0+$", ""); 

\0爲與數值0(有時稱爲NUL)的Unicode字符的逸出。換句話說:

System.out.println((int) "\0".charAt(0)); // prints 0 

你試過的東西似乎也適用於我。 (見Ideone example。)不知道爲什麼它不適合你。可能還有另一個問題。確保你重新分配結果。 ; )

+0

這對我不起作用,因爲在字符串中的0字節字符之前沒有'\',也沒有實際的'0'。該字符基本上爲空。 – TheNewGuy

+0

看我的編輯。對不起,我想我最初可以解釋它。 '\'沒有出現在字符串中,這是一個轉義。 – Radiodef

+1

在這種情況下,這對我來說很好。我選擇了另一個答案作爲答案,因爲它看起來更乾淨,但是這個代碼很實用,並且完成了工作,謝謝! – TheNewGuy