簡體   English   中英

解碼和編碼問題。 android.util。*和java.util。*中Base64 Class的不同實現?

[英]Decoding and Encoding issue. Different implementations of Base64 Class in android.util.* and java.util.*?

我正在編寫一個App,它使用給定的String 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,...,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);
}

解碼(服務器: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;
}

您必須使用JSONObjects將Base64字符串發送到服務器。 如果是這樣,那么JSONObject會將“\\”轉義字符添加到字符串中,這些字符是非法的Base64字符。 你需要做的就是

String rectifiedString = Base64String.replace("\\","");

在使用獲取的字符串之前在服務器端。

可選的

另外在服務器端使用

import javax.xml.bind.DatatypeConverter;

String result = DatatypeConverter.printBase64Binary(bytearrayToDecode);

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

代替。

它不僅可以完成工作,而且可以更快地進行編碼/解碼( 在此處進行基准測試 )。

如果編碼字符串中有空格,則在base64中是非法字符。 如果刪除它,它仍會在鏈接到的轉換器中生成相同的圖像/數據,現在也可以通過代碼進行解碼。

更新:一些解碼器(如您鏈接的解碼器,或Java中的Base64.getMimeDecoder())忽略非法字符,其他解碼器(如Base64.getDecoder())不允許它們。

用於編碼:

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

並解碼:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM