Java通用:将字节数组转换为字符串(非十六进制,十进制)

3
什么是将字节数组转换为指定进制字符串的最佳方法?在S.O.和其他地方有大量的示例可以将其转换为十六进制字符串。我主要感兴趣的是转换为不同于十六进制或十进制字符串的内容;同时,更通用的方式也很重要。
这是我目前使用的方法:
byte[] input;
String MyStr = new BigInteger(input).toString(radix);

这样做是可行的,但由于Java有基数(radix)的概念,就像在Integer中使用的一样。这似乎是Character所定义的显式目的。难道就没有更好的方法来做这件事,而不是先将字节数组转换为BigInteger吗?感觉我的Java知识缺少了一些必要的标准类?
编辑: 我想使用这种方法压缩表示和打印不同类型的原始二进制数据。这是我目前使用的实际基数:
String MyStr = new BigInteger(data).toString(Character.MAX_RADIX);

最大基数(36)使用小写字母和数字的组合。这样可以得到相当不错的压缩效果,但如果基数还包括大写字母,效果会更好,这就是为什么我认为可能有东西我没注意到。


你能举出字节的例子并说明你期望得到的结果吗? - Bohemian
1
对我来说,这看起来非常面向对象,你得到值表示,然后将其转换为字符串。你担心性能吗?至少代码是自说明的。 - Zielu
@Bohemian。我稍微修改了一下,包括我的使用基数。 - Andy
我假设你的输入是一个 byte[],而不是一个 Byte[],因为没有一个 BigInteger 构造函数可以接受一个 Byte[] - ericbn
你打算如何处理生成的字符串?它需要是可读的吗? - Bohemian
显示剩余2条评论
2个回答

3

看起来你正在寻找Base64编码。这种编码使用64个不同的字符来编码一个值:大写字母和小写字母(已经有52个字符了),数字(还有10个,包括“0”),以及“+”和“/”符号(或url安全变体中的“-”和“_”)。

如果你正在使用Java 8,有Base64类:

String str = Base64.Encoder.encodeToString(data);

否则,Apache Commons 也有一个 Base64 类:
String str = Base64.encodeBase64String(data);

谢谢!这很有用,而且很棒它现在成为Java8的一部分。我应该想到了这一点。我仍然有时需要基数为2和16进行调试,但大多数情况下,Base64应该没问题。 - Andy

0

这是个好问题,实际上我也不确定是否有一个类可以实现这个。但是另一种方法是在不使用BigInteger的情况下遍历数组并获取输出,类似于:

for(byte b : input){
    System.out.print(Integer.toString(b & 0xFF, radix));
}

不确定是否有特定的类可以进行转换,但我知道另一种方法,也许对你或其他人有用。

编码愉快。

敬礼。


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