将字节数组转换为转义字符串

问题描述:

我需要一些帮助将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

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