如何在Java中将字节数组转换为字符串?

18

如何在不进行转换的情况下将一个 bytes 数组转换为 String

我尝试过:

  String doc=new String( bytes);

但是文档文件与字节码文件(字节码是二进制信息)不同。例如:


  String doc=new String( bytes);
  byte[] bytes2=doc.getBytes();

bytesbytes2是不同的。

附注:UTF-8不适用,因为它会将某些字节转换为不同的值。我进行了测试,它不能工作。

附注2:而且,我不想使用BASE64


你必须使用适当的编码。 - nachokk
@TheNewIdiot 那篇帖子中的答案根本没有解决问题。我想要一个逐字节转换,而答案却说“转换或放弃”。Java怎么可能做不到呢? - magallanes
Java 对二进制数据(字节)和文本(String)进行了出色的区分。对于文本,它们选择了内部 Unicode,因此涵盖了所有语言。虽然您可以使用像 ISO-8559-1 这样的编码将字节转换为字符串及其反向操作,但这些字符串可能会有二进制 0 等问题。 - Joop Eggen
你几乎肯定需要Base64,这是唯一能让你获得可逆的字节到字符串编码的方法。 - Louis Wasserman
3个回答

16

你需要明确指定所需的编码,例如UTF-8。

String doc = ....
byte[] bytes = doc.getBytes("UTF-8");
String doc2 = new String(bytes, "UTF-8");

docdoc2 将是相同的。

要解码一个 byte[],您需要知道使用了什么编码方式以确保它会正确解码。


14

这是一种将字节数组转换为 String 并反向转换的方法:

String doc=new String(bytes, "ISO-8859-1");
byte[] bytes2=doc.getBytes("ISO-8859-1");

字符串是一系列字符,因此您需要以某种方式将字节编码为字符。 ISO-8859-1 编码将每个字节映射到单个唯一字符,因此可以安全地使用它进行转换。请注意,其他编码(例如UTF-8)在这个意义上不安全,因为这些编码中有一些字节序列不能映射为有效的字符串。


这在Java中可以工作,因为即使是二进制0(C字符串终止符)也能正常工作。 - Joop Eggen
非常帮助我!否则,我会一直苦恼于byte[]! - AVA
2
关于 ISO-8859-1 编码的小技巧不错。 - tarka

1
"适当的byte[]和String之间的转换是明确指定您想要使用的编码方式。如果您从byte[]开始,实际上它并不包含文本数据,则没有'适当的转换'。字符串用于文本,byte[]用于二进制数据,唯一真正明智的做法是避免在它们之间进行转换,除非您绝对必须这样做。"
"如果您真的必须使用String来保存二进制数据,则最安全的方法是使用Base64编码。"
"Source by Michael Borgwardt"

如果字符串只是一种表示形式呢?并且在转换回字节数组时,我们使用适当的转换方法呢? - Eftekhari

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