Base 64解码byte []被转换为字符串

时间:2014-10-17 12:19:50

标签: java android

我得到了一些编码的日志信息,这些信息被转换成一个字符串用于传输目的(演员可能很难看,但它有效)。

我正在尝试将其强制转换为byte []以便对其进行解码,但它无法正常工作:

byte[] encodedBytes = android.util.Base64.encode((login + ":" + password).getBytes(), NO_WRAP);
String encoded = "Authentification " + encodedBytes;

String to_decode = encoded.substring(17);
byte[] cast1 = to_decode;            // error
byte[] cast2 = (byte[]) to_decode;   // error
byte[] cast3 = to_decode.getBytes();
// no error, but i get something totally different from encodedBytes (the array is even half the size of encodedBytes)
// and when i decode it i got an IllegalArgumentException

这三个演员都没有用,有什么想法吗?

1 个答案:

答案 0 :(得分:4)

这里有很多问题。

一般情况下,您需要使用Base64.decode来反转Base64.encode的结果:

byte[] data = android.util.Base64.decode(to_decode, DEFAULT);

一般来说,你应该总是问问自己"我是如何进行从X型到Y型的转换?"在研究如何从Y型返回到X型时。

请注意,您的代码中也有拼写错误 - " Authentification"应该是"身份验证"。

但是, 您的编码问题 - 您正在创建byte[],并且使用字符串连接会调用toString()在字节数组上,你想要什么。你应该拨打encodeToString。这是一个完整的例子:

String prefix = "Authentication "; // Note fix here...
// TODO: Don't use basic authentication; it's horribly insecure.
// Note the explicit use of ASCII here and later, to avoid any ambiguity.
byte[] rawData = (login + ":" + password).getBytes(StandardCharsets.US_ASCII);
String header = prefix + Base64.encodeToString(rawData, NO_WRAP);

// Now to validate...
String toDecode = header.substring(prefix.length());
byte[] decodedData = Base64.decode(toDecode, DEFAULT);
System.out.println(new String(decodedData, StandardCharsets.US_ASCII));