如何在 Java 中将二进制数据转换为字符串并返回?
-
09-06-2019 - |
题
我的文件中有二进制数据,我可以将其读入字节数组并毫无问题地进行处理。现在我需要通过网络连接将部分数据作为 XML 文档中的元素发送。我的问题是,当我将数据从字节数组转换为字符串,然后再转换回字节数组时,数据会损坏。我已经在一台机器上对此进行了测试,以将问题隔离到字符串转换,因此我现在知道它不会被 XML 解析器或网络传输损坏。
我现在拥有的是
byte[] buffer = ...; // read from file
// a few lines that prove I can process the data successfully
String element = new String(buffer);
byte[] newBuffer = element.getBytes();
// a few lines that try to process newBuffer and fail because it is not the same data anymore
有谁知道如何在不丢失数据的情况下将二进制转换为字符串并返回?
回答:谢谢萨姆。我觉得自己像个白痴。我昨天得到了这个答案,因为我的 SAX 解析器正在抱怨。出于某种原因,当我遇到这个看似独立的问题时,我并没有想到这是同一问题的新症状。
解决方案
如果您使用base64对其进行编码,这会将任何数据转换为ascii安全文本,但是base64编码的数据比原始数据大
其他提示
字符串(字节[]) 将数据视为默认字符编码。因此,字节从 8 位值转换为 16 位 Java Unicode 字符的方式不仅会因操作系统而异,甚至在同一台计算机上使用不同代码页的不同用户之间也会有所不同!此构造函数仅适用于解码您自己的文本文件之一。不要尝试在 Java 中将任意字节转换为字符!
编码为 64位基数 是一个很好的解决方案。这就是通过 SMTP(电子邮件)发送文件的方式。(免费)阿帕奇 通用编解码器 项目将完成这项工作。
byte[] bytes = loadFile(file);
//all chars in encoded are guaranteed to be 7-bit ASCII
byte[] encoded = Base64.encodeBase64(bytes);
String printMe = new String(encoded, "US-ASCII");
System.out.println(printMe);
byte[] decoded = Base64.decodeBase64(encoded);
或者,您可以使用 Java 6 数据类型转换器:
import java.io.*;
import java.nio.channels.*;
import javax.xml.bind.DatatypeConverter;
public class EncodeDecode {
public static void main(String[] args) throws Exception {
File file = new File("/bin/ls");
byte[] bytes = loadFile(file, new ByteArrayOutputStream()).toByteArray();
String encoded = DatatypeConverter.printBase64Binary(bytes);
System.out.println(encoded);
byte[] decoded = DatatypeConverter.parseBase64Binary(encoded);
// check
for (int i = 0; i < bytes.length; i++) {
assert bytes[i] == decoded[i];
}
}
private static <T extends OutputStream> T loadFile(File file, T out)
throws IOException {
FileChannel in = new FileInputStream(file).getChannel();
try {
assert in.size() == in.transferTo(0, in.size(), Channels.newChannel(out));
return out;
} finally {
in.close();
}
}
}
看到这个问题, 如何在 XML 中嵌入二进制数据?不要将 byte[] 转换为 String,然后将其推入 XML 中的某个位置,而是通过 BASE64 编码将 byte[] 转换为 String(某些 XML 库具有可以为您执行此操作的类型)。从 XML 返回字符串后进行 BASE64 解码。
使用 http://commons.apache.org/codec/
由于各种奇怪的字符集限制和非打印字符的存在,您的数据可能会变得混乱。坚持使用 BASE64。
您如何构建 XML 文档?如果您使用 java 内置的 XML 类,那么应该为您处理字符串编码。
查看 javax.xml 和 org.xml 包。这就是我们用来生成 XML 文档的工具,它可以很好地处理所有字符串编码和解码。
- -编辑:
嗯,我想我误解了这个问题。您不是在尝试对常规字符串进行编码,而是对某些任意二进制数据集进行编码?在这种情况下,早期评论中建议的 Base64 编码可能是正确的选择。我相信这是一种在 XML 中编码二进制数据的相当标准的方法。