Base64でエンコードされた文字列があります。次のようになります。
eyJibGExIjoiYmxhMSIsImJsYTIiOiJibGEyIn0=
どのオンラインツールでも、これを{"bla1":"bla1","bla2":"bla2"}
である適切な文字列にデコードできます。ただし、私のJava実装は失敗します:
import Java.util.Base64;
System.out.println("payload = " + payload);
String json = new String(Base64.getDecoder().decode(payload));
次のエラーが発生します。
payload = eyJibGExIjoiYmxhMSIsImJsYTIiOiJibGEyIn0=
Java.lang.IllegalArgumentException: Input byte array has incorrect ending byte at 40
私のコードの何が問題になっていますか?
わかった。元の文字列はBase64.encodeToString(json.getBytes("UTF-8"), Base64.DEFAULT);
でAndroidデバイスを使用して_Android.util.Base64
_を使用してエンコードされています。これは_Android.util.Base64.DEFAULT
_エンコーディングスキームを使用しています。
次に、サーバーサイドで_Java.util.Base64
_を使用する場合、これはBase64.getMimeDecoder().decode(payload)
でデコードする必要がありますnot with Base64.getDecoder().decode(payload)
引数の文字列を使用しようとしました。 arg[0].trim()
を使用すると、それが機能することがわかりました。例えば
Base64.getDecoder().decode(arg[0].trim());
私はそれを台無しにしてしまうある種の空白があると思います。
遅すぎるかもしれませんが、私もこの問題を抱えていました。
デフォルトでは、Android Base64 utilは、エンコードされた文字列の最後に改行文字を追加します。
Base64.NO_WRAPフラグは、改行文字なしでエンコードされた文字列を作成するようにutilに指示します。
Androidアプリはsrc
を次のようにエンコードする必要があります:
String encode = Base64.encodeToString(src.getBytes(), Base64.NO_WRAP);