解码和编码问题。 android.util。*和java.util。*中Base64 Class的不同实现?

时间:2014-03-27 18:25:02

标签: java android encoding base64 decoding

我正在编写一个App,它使用给定的String str执行以下操作:

encode(encrypt(encode(stringToBytearray(str))));

服务器接收Base64编码的字符串,然后对其进行解码 - >解密 - >解码,从App获取发送的String 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)

String的格式为" [string,string,...,string]"没有" s。

就像我上面提到的,对于不太长的字符串(抱歉我无法量化长度),这是有效的。所以我认为我是正确实施的。

奇怪的是,如果我不发送它,但解码(decrypt(decode(stringToBytearray(str))));设备本身的字符串,一切都很完美。

我的设置: JDK 7,eclipse(adt-bundle,android开发)(Windows 7)

JDK 8,eclipse('普通' 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);
}

解码(服务器:在Linux上,jdk 8):

import java.util.Base64

public byte[] decode(byte[] bytearrayToEncode){
   return Base64.getUrlDecoder().decode(bytearrayToDecode);
}

字符串全部使用相同的字符集(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;
}

3 个答案:

答案 0 :(得分:10)

您必须使用JSONObjects将Base64字符串发送到服务器。如果是这样,那么JSONObject会将“\”转义字符添加到字符串中,这些字符是非法的Base64字符。您需要做的就是

String rectifiedString = Base64String.replace("\\","");
在使用获取的字符串之前在服务器端

<强>可选

同样在服务器端使用

import javax.xml.bind.DatatypeConverter;

String result = DatatypeConverter.printBase64Binary(bytearrayToDecode);

byte[] result = DatatypeConverter.parseBase64Binary(str);

代替。

它不仅可以完成工作,而且可以更快地进行编码/解码(as benchmarked here)。

答案 1 :(得分:1)

如果编码字符串中有空格,则在base64中是非法字符。如果删除它,它仍然会在链接到的转换器中生成相同的图像/数据,现在也可以通过代码进行解码。

<强>更新 一些解码器(如您链接的解码器或Java中的Base64.getMimeDecoder())忽略非法字符,其他解码器(如Base64.getDecoder())不允许它们。

答案 2 :(得分:0)

用于编码:

Base64.getEncoder().encodeToString(yourString.getBytes("UTF-8"));

并解码:

byte[] decodedBytes = Base64.getDecoder().decode(yourString);
String stringDecode = new String(decodedBytes, "UTF-8");