1

我正在尝试将输入流中的字节编码为纯文本字符。所以,我用空格分隔的整数组成了字符串,如下所示:

InputStream in;
//etc
int b;
String finalString="";
while((b=in.read())!=-1)finalString+=""+b+" ";
in.close()

但问题是,这使得字符串比原始字节大 3-4 倍。有没有其他方法可以将字节编码为纯文本?

4

6 回答 6

3

如果我理解正确,您想将二进制数据转换为纯文本。您应该为此使用 Base64。损耗因子仅为 4/3。

Apache commons-codec 有一个 Base64 编码器(和解码器)的免费实现。

另一种可能性是十六进制编码(commons-codec 也支持),但对于每个二进制数据字节,它需要 2 个字节的文本。

于 2012-07-11T17:29:09.930 回答
1

如果你可以把它全部放在一个单一的byte[],那么这应该只是

new String(byteArray, StandardCharsets.UTF_16LE);

或您希望输入使用的任何字符编码。

于 2012-07-11T17:26:36.250 回答
1

您可以获取所有字节并将它们输出到字节数组中,然后使用字节数组创建字符串。

IE

String newString = new String(byteArray);
于 2012-07-11T17:28:37.527 回答
1

您当前的解决方案生成的字符串比文件中的内容长 3..4 倍,因为它将十进制字符代码连接成一个字符串。

Java 提供了一种无需编写循环即可从流中读取字符串的方法,如下所示:

InputStream in;
BufferedReader r = new BufferedReader(new InputStreamReader(in, "UTF8"));
String s = r.readLine();
于 2012-07-11T17:29:11.390 回答
1

按照这里的文档

例如,如果您的字符串是 UTF8:

byte[] bytes = // you got that from somewhere...
String x = new String(bytes, "UTF8");
于 2012-07-11T17:29:19.563 回答
1

Commons-codec 具有将字节编码为 Base64 编码的方法。

encodedText = new String(
                 org.apache.commons.codec.binary.Base64.encodeBase64(byteArray));
于 2012-07-11T17:29:24.667 回答