在Java中将字节转换为字符串

29

我使用以下代码将字节转换为字符串:

System.out.println("string " + Byte.toString((byte)0x63));

为什么它输出 "string 99"。 如何修改才能让它输出 "string c"?


仅仅将一个字节转换为字符串是不可能的。你必须使用字符编码。 - Raedwald
10个回答

46
System.out.println(new String(new byte[]{ (byte)0x63 }, "US-ASCII"));

需要特别注意的是,将字节转换为字符串始终涉及到编码。如果不指定编码,将使用平台默认编码,这意味着在不同环境中运行时代码可能会出错。


14
为避免该构造函数抛出 UnsupportedEncodingException 异常,您可能希望传递 StandardCharsets.US_ASCII 而不是使用字符集名称。 - gustafc

23

字符串构造函数适用于此转换:

System.out.println("string " + new String(new byte[] {0x63}));

3
因为 gustafc 的回答有一个非常重要的观点:String(byte[]) 构造函数使用系统默认编码将字节数组转换为字符串字符。人们不应该假设 0x63 字节值被映射到字母 'c'。例如,在 UTF-16 中,字母 'c' 被表示为两个编码字节,而不是一个字节。这篇博客文章详细阐述了这一点: http://www.joelonsoftware.com/articles/Unicode.html - tbacker

15

使用char而不是byte:

System.out.println("string " + (char)0x63);

或者如果你想成为一个Unicode纯粹主义者,你可以使用代码点:

System.out.println("string " + new String(new int[]{ 0x63 }, 0, 1));

如果您喜欢老派的 US-ASCII "每个字节都是一个字符" 的理念:

System.out.println("string " + new String(new byte[]{ (byte)0x63 },
                                          StandardCharsets.US_ASCII));
避免使用其他答案中推荐的String(byte[])构造函数,它依赖于默认字符集。情况可能会出现,其中0x63实际上不是字符c

6
您可以使用 printf
System.out.printf("string %c\n", 0x63);

您也可以使用String#format创建具有此格式的字符串:

String s = String.format("string %c", 0x63);

3

您可以使用

字符等价于0x63的是'c',但其字节等价于99

System.out.println("byte "+(char)0x63); 

2

您需要利用一个字节数组构建一个新的字符串。你的byteArray中第一个元素应该是0x63。如果您想添加更多的字母,请让byteArray变得更长,并将它们添加到下一个索引。

byte[] byteArray = new byte[1];
byteArray[0] = 0x63;

try {
    System.out.println("string " + new String(byteArray, "US-ASCII"));
} catch (UnsupportedEncodingException e) {
    // TODO: Handle exception.
    e.printStackTrace();
}

请注意,指定编码最终会抛出一个UnsupportedEncodingException异常,您必须相应地处理该异常。

1
如果是单个字节,只需将 byte 转换为 char,就应该能正常工作,即给出与给定字节的码点值对应的 char 实体。如果不是,则使用在其他地方提到的 String 构造函数。
char ch = (char)0x63;
System.out.println(ch);

1
String str = "0x63";
int temp = Integer.parseInt(str.substring(2, 4), 16);
char c = (char)temp;
System.out.print(c);

1
这是我的版本:
public String convertBytestoString(InputStream inputStream)
{
    int bytes;
    byte[] buffer = new byte[1024];

    bytes = inputStream.read(buffer);
    String stringData = new String(buffer,0,bytes);

    return stringData;

}

0
在Java中使用StringBuilder类:
StringBuilder str = new StringBuilder();
        for (byte aByte : bytesArray) {
            if (aByte != 0) {
                str.append((char) aByte);
            } else {
                break;
            }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接