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

解码和编码问题。在android.util.*和java.util.*中Base64类的不同实现?,java,android,encoding,base64,decoding,Java,Android,Encoding,Base64,Decoding,我正在编写一个应用程序,它使用给定的字符串str执行以下操作: encode(encrypt(encode(stringToBytearray(str)))); 服务器接收Base64编码的字符串,然后对其进行解码->解密->解码,以从应用程序获取发送的字符串str 不幸的是,它不适用于所有字符串,长字符串导致长Base64字符串,我的服务器引发以下异常: Exception in thread "main" java.lang.IllegalArgumentException: Illega

我正在编写一个应用程序,它使用给定的字符串str执行以下操作:

encode(encrypt(encode(stringToBytearray(str))));
服务器接收Base64编码的字符串,然后对其进行解码->解密->解码,以从应用程序获取发送的字符串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]”,没有“s”

就像我上面提到的,对于不太长的字符串(对不起,我还不能量化长度),这是可行的。所以我认为我实现它是正确的

奇怪的是,如果我不发送它,而是解码(解密(解码(stringToBytearray(str)));设备上的字符串本身,它就能完美地工作

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

JDK 8,eclipse(‘普通’java)(Linux(xubuntu))

这是因为两个类(Base64)的实现方式不同吗?如果是这样,我如何使其工作

以下是编码/解码方法:

编码(设备:在Windows 7、adt捆绑包、Android Dev、jdk 7上):

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

字符串都使用相同的字符集(utf-8)进行反/编码! 编码/解码:Base64

加密:AES

如果你需要更多的信息,尽管问,但我想我已经提供了所有必要的信息

编辑:


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

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

可选

同样在服务器端使用

import javax.xml.bind.DatatypeConverter;

String result=DatatypeConverter.printbase64二进制(bytearrayToDecode);

相反


它不仅可以完成任务,而且编码/解码速度更快()。

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

更新: 有些解码器(如您链接的解码器或Java中的Base64.getMimeDecoder())忽略非法字符,而另一些解码器(如Base64.getDecoder())不允许使用非法字符。

用于编码:

Base64.getEncoder().encodeToString(yourString.getBytes(“UTF-8”);
并解码:

byte[]decodedBytes=Base64.getDecoder().decode(您的字符串);
String stringDecode=新字符串(decodedBytes,“UTF-8”);

0x5b是[,正如我所说的字符串格式是[String,…,String]。但是,当字符串太长时,为什么所有的编码/解码都在设备上工作,而不是在服务器上工作。(我比较了两个长字符串,并且它们相等)当长度太大时,您的服务器是否正在修剪查询参数?请尝试回显收到的base-64消息,并检查它们是否完全相等。因为截断的字符串可能不再是有效的base-64加密消息。我刚刚发现,第二次调用encode不适用(尽管我认为我已经检查过它)。到目前为止,感谢所有建议!我将尝试找出原因。我在java.util.Base64中使用了不同的编码器。您是否尝试过Base64.getDecoder()而不是Base64.getUrlDecoder()?在我看来,PrintBase64 Binary为您去除了反斜杠。感谢您的洞察力。我遇到了与OP相同的问题。
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;
}
String rectifiedString = Base64String.replace("\\","");
import javax.xml.bind.DatatypeConverter;
byte[] result = DatatypeConverter.parseBase64Binary(str);