我在文件中有二进制数据,我可以读入字节数组并且没有任何问题.现在,我需要通过网络连接将部分数据作为XML文档中的元素发送.我的问题是,当我将数据从一个字节数组转换为一个字符串并返回一个字节数组时,数据就会被破坏.我已经在一台机器上对此进行了测试,以将问题与String转换隔离开来,所以我现在知道它不会被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
有谁知道如何将二进制转换为String并返回而不会丢失数据?
回答:谢谢Sam.我觉得自己像个白痴.我昨天得到了回答,因为我的SAX解析器在抱怨.出于某种原因,当我遇到这个看似独立的问题时,我并没有想到它是同一问题的新症状.
编辑:为了完整起见,我使用Apache Commons Codec包中的Base64类来解决这个问题.
String(byte [])将数据视为默认字符编码.因此,字节从8位值转换为16位Java Unicode字符的方式不仅会因操作系统而异,甚至可能因同一台计算机上使用不同代码页的不同用户而异.此构造函数仅适用于解码您自己的一个文本文件.不要尝试将任意字节转换为Java中的字符!
编码为base64是一个很好的解决方案.这是通过SMTP(电子邮件)发送文件的方式.(免费)Apache Commons Codec项目将完成这项工作.
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 DatatypeConverter:
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 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();
}
}
}
如果您在base64中对其进行编码,则会将任何数据转换为ascii安全文本,但base64编码数据大于orignal数据