web-dev-qa-db-ja.com

入力バイト配列の40に不正な終了バイトがあります

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

私のコードの何が問題になっていますか?

15
toom

わかった。元の文字列は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)

22
toom

引数の文字列を使用しようとしました。 arg[0].trim()を使用すると、それが機能することがわかりました。例えば

Base64.getDecoder().decode(arg[0].trim());

私はそれを台無しにしてしまうある種の空白があると思います。

1
JustGage

遅すぎるかもしれませんが、私もこの問題を抱えていました。

デフォルトでは、Android Base64 utilは、エンコードされた文字列の最後に改行文字を追加します。
Base64.NO_WRAPフラグは、改行文字なしでエンコードされた文字列を作成するようにutilに指示します。

Androidアプリはsrcを次のようにエンコードする必要があります:

String encode = Base64.encodeToString(src.getBytes(), Base64.NO_WRAP);
0
Artem Komarov