代码之家  ›  专栏  ›  技术社区  ›  user3469811

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

  •  10
  • user3469811  · 技术社区  · 10 年前

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

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

    服务器接收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)
    

    字符串的格式为“[String,String,…,String]”,不带“s”。

    就像我前面提到的,对于不太长的字符串(抱歉,我还不能量化长度),这是有效的。所以我认为我实施得很好。

    奇怪的是,如果我不发送,而是解码(decode(stringToBytearray(str)));设备上的字符串本身,它都工作得很好。

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

    JDK 8,eclipse('normal'java)(Linux(xubuntu))

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

    以下是编码/解码方法:

    编码(设备:在Windows 7上,adt捆绑包,Android开发人员,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 回复  |  直到 10 年前
        1
  •  11
  •   Mohsin Ali    9 年前

    必须使用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 ).

        2
  •  1
  •   Anand Varkey Philips Rohit upadhyay    7 年前

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

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

        3
  •  0
  •   General Failure shilu    7 年前

    用于编码:

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

    并解码:

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