2011-09-20 152 views
1

我需要一些幫助將java字節數組轉換爲7位ASCII字符串。不過,我正在獲取8位序列,並且需要將任何不可讀的字符轉義爲它的轉義序列。有沒有一個簡單的解決方案,或者我需要建立自己的?將字節數組轉換爲轉義字符串

眼看可讀字符7位ASCII的範圍是連續的,現在我想到的是以下內容:

for(int i = 0; i < buffer.length; i++) { 
    int codePoint = ((int) buffer[ i ]) & 255; 
    if(0x20 <= codePoint && codePoint <= 0x7e) { 
     res = res + String((char) codePoint); 
    } else { 
    String c = Integer.toHexString(codePoint); 
    if(c.length() < 2) { 
     c = "0" + c; 
    } 
    res = res + "\\0x" + c; 
    } 
} 

然而,這似乎是一個可怕的很多工作,對於這樣一個簡單的轉換。有沒有更好的辦法?

此外,我可能需要對已經從字節數組轉換爲字符串的數據執行相同操作。在這種情況下是否有更簡單的解決方案?

+2

這正是base64的設計目的。對於字符串,使用'getBytes(Charset)'方法(你必須決定你想要輸出的字符集編碼)。 – Jesse

+1

'0x20> = codePoint && codePoint> = 0x7e'總是爲false。我認爲你的意思是'<='。 –

+0

@Jim:是的,這是一個錯字。固定。 – LiKao

回答

1
public static String escape(byte[] data) { 
    StringBuilder cbuf = new StringBuilder(); 
    for (byte b : data) { 
     if (b >= 0x20 && b <= 0x7e) { 
     cbuf.append((char) b); 
     } else { 
     cbuf.append(String.format("\\0x%02x", b & 0xFF)); 
     } 
    } 
    return cbuf.toString(); 
    } 

您可以使用format方法來削減措詞。

請注意,此方法是安全的,因爲ASCII範圍與Java字符串使用的UTF-16編碼的較低範圍相匹配。

+0

比我做的更乾淨一點,但對於這樣一個簡單的任務似乎還有很多工作要做。接受,因爲我以完全不相關的方式解決了問題,使整個程序更清潔。 – LiKao

相關問題