Java 使用二进制编码将字节[]转换为字符串

Java 使用二进制编码将字节[]转换为字符串,java,string,character-encoding,Java,String,Character Encoding,我想将每个字节从字节[]转换为字符,然后将这些字符放在字符串上。这就是某些数据库的所谓“二进制”编码。到目前为止,我能找到的最好的是这个巨大的样板: byte[] bytes = ...; char[] chars = new char[bytes.length]; for (int i = 0; i < bytes.length; ++i) { chars[i] = (char) (bytes[i] & 0xFF); } String s = new String(cha

我想将每个
字节
字节[]
转换为
字符
,然后将这些字符放在字符串上。这就是某些数据库的所谓“二进制”编码。到目前为止,我能找到的最好的是这个巨大的样板:

byte[] bytes = ...;
char[] chars = new char[bytes.length];
for (int i = 0; i < bytes.length; ++i) {
    chars[i] = (char) (bytes[i] & 0xFF);
}
String s = new String(chars);

但是我还不愿意写一个字符集和它们的编解码器。JRE或Apache Commons中是否有这样一个现成的二进制字符集?

您可以对7位字符使用ASCII编码

String s = "Hello World!";
byte[] b = s.getBytes("ASCII");
System.out.println(new String(b, "ASCII"));
或8位ascii码

String s = "Hello World! \u00ff";
byte[] b = s.getBytes("ISO-8859-1");
System.out.println(new String(b, "ISO-8859-1"));
编辑

印刷品

ASCII => US-ASCII
US-ASCII => US-ASCII
ISO-8859-1 => ISO-8859-1

有一个字符串构造函数,它接受字节数组和指定字节格式的字符串:

String s = new String(bytes, "UTF-8");   // if the charset is UTF-8
String s = new String(bytes, "ASCII");   // if the charset is ASCII

您可以跳过字符数组和输入字符串的步骤,甚至可以使用StringBuilder(如果您担心多线程,可以使用StringBuffer)。我的示例显示了StringBuilder

byte[] bytes = ...;
StringBuilder sb = new StringBuilder(bytes.length);
for (int i = 0; i < bytes.length; i++) {
  sb.append((char) (bytes[i] & 0xFF));
}

return sb.toString();
byte[]字节=。。。;
StringBuilder sb=新的StringBuilder(字节.长度);
for(int i=0;i

我知道这不能回答你的另一个问题。只是想帮助简化“样板”代码。

您可以使用base64编码。有一个由apache完成的实现

基数64

谢谢,但是会有一些8位字符。我相信编码是“US-ASCII”。反过来说,“ASCII”是“US-ASCII”的别名。显然,这两种方法都能奏效,我只是说这是java使用的“官方”名称。@Peter Lawrey:从您链接的文章中可以看出:“US-ASCII是Internet Assigned Numbers Authority(IANA)首选的ASCII字符集名称。”此外,我相信所有java实现中都需要的字符集是“US-ASCII”.标准字符集标识符列在
charset
Javadoc中:那“巨大的样板文件”是什么?只需将其包装在一个接受字节数组并返回字符串的方法中即可。不完全确定您的问题。ISO 8859-1(拉丁语-1)不会起作用吗?这是一种8位单字节编码…@ColinD,以前进行过包装。但我不得不在不同的项目中多次编写这种方法,它们之间没有共享库。我不想只为这个建立一个图书馆。这就是为什么我们使用java.util、java.text、java.lang和ApacheCommons之类的东西。UTF-8将一些多字节字符转换为单个字符,所以它不起作用。ASCII仅处理7位字符,并且将存在一些7位字符。为什么这会得到否决票?我告诉过你,字符串构造函数做的正是你想要它做的。很抱歉没有为你做关于charset使用什么的研究…这不是我的反对票。顺便说一句,感谢您尝试回答。如果您将
StringBuilder
用作示例中的局部变量,则没有理由不使用
StringBuffer
。@ColinD已修改为StringBuilder。你说得对。习惯于使用StringBuffer,因为这是Java 5之前的全部功能。另外,我们有一个多线程应用程序,所以StringBuffer对我们来说很好。但我要说的是你的观点。
String s = new String(bytes, "UTF-8");   // if the charset is UTF-8
String s = new String(bytes, "ASCII");   // if the charset is ASCII
byte[] bytes = ...;
StringBuilder sb = new StringBuilder(bytes.length);
for (int i = 0; i < bytes.length; i++) {
  sb.append((char) (bytes[i] & 0xFF));
}

return sb.toString();