我得到了一些编码的日志信息,这些信息被转换成一个字符串用于传输目的(演员可能很难看,但它有效)。
我正在尝试将其强制转换为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
这三个演员都没有用,有什么想法吗?
答案 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));