use*_*811 10 java base64 encoding android decoding
我正在编写一个App,它使用给定的String str执行以下操作:
encode(encrypt(encode(stringToBytearray(str))));
Run Code Online (Sandbox Code Playgroud)
服务器接收Base64编码的字符串,然后解码 - >解密 - >解码,从App获取发送的字符串str.
不幸的是,它不适用于所有字符串,长字符串导致长Base64字符串,我的服务器抛出以下异常:
Exception in thread "main" java.lang.IllegalArgumentException: Illegal base64 character 5b
at java.util.Base64$Decoder.decode0(Base64.java:714)
at java.util.Base64$Decoder.decode(Base64.java:526)
at Main.decode(Main.java:113)
at Main.main(ain.java:33)
Run Code Online (Sandbox Code Playgroud)
String的格式为"[string,string,...,string]",不带"s".
就像我上面提到的,对于不太长的字符串(抱歉我无法量化长度),这是有效的.所以我认为我是正确的.
奇怪的是,如果我不发送它,但解码(decrypt(decode(stringToBytearray(str)))); 设备本身的字符串,一切都很完美.
我的设置:JDK 7,eclipse(adt-bundle,android开发)(Windows 7)
JDK 8,eclipse('normal'java)(Linux(xubuntu))
是因为两个类(Base64)都是差异实现的吗?如果是这样,我怎样才能使它工作?
以下是编码/解码方法:
编码(设备:在Windows 7上,adt-bundle,Android-Dev,jdk 7):
import android.util.Base64
public byte[] encode(byte[] bytearrayToEncode){
return Base64.encode(bytearrayToEncode, Base64.NO_WRAP|Base64.URL_SAFE);
}
Run Code Online (Sandbox Code Playgroud)
解码(服务器:Linux,jdk 8):
import java.util.Base64
public byte[] decode(byte[] bytearrayToEncode){
return Base64.getUrlDecoder().decode(bytearrayToDecode);
}
Run Code Online (Sandbox Code Playgroud)
字符串都使用相同的字符集(utf-8)进行解码/编码!编码/解码:Base64
加密:AES
如果您需要更多信息,请问,但我想我提供了所有必要的信息.
编辑:
public String bytearrayToString(byte[] bytearray){
String str = null;
try {
str = new String(bytearray, "UTF-8");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return str;
}
public byte[] stringToBytearray(String str){
byte[] bytearray = null;
try {
bytearray = str.getBytes("UTF-8");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return bytearray;
}
Run Code Online (Sandbox Code Playgroud)
Moh*_*Ali 10
您必须使用JSONObjects将Base64字符串发送到服务器.如果是这样,那么JSONObject会将"\"转义字符添加到字符串中,这些字符是非法的Base64字符.你需要做的就是
String rectifiedString = Base64String.replace("\\","");
Run Code Online (Sandbox Code Playgroud)
在使用获取的字符串之前在服务器端.
可选的
另外在服务器端使用
import javax.xml.bind.DatatypeConverter;
Run Code Online (Sandbox Code Playgroud)
和
String result = DatatypeConverter.printBase64Binary(bytearrayToDecode);
byte[] result = DatatypeConverter.parseBase64Binary(str);
Run Code Online (Sandbox Code Playgroud)
代替.
它不仅可以完成工作,而且可以更快地进行编码/解码(在此处进行基准测试).
| 归档时间: |
|
| 查看次数: |
14688 次 |
| 最近记录: |