16

別のバイト配列ではなく、バイト配列からスターリングに Base64 エンコードを行う必要があります。しかし、それをデコードすると例外が発生します。ここにコードがあります

Base64 エンコーディングを使用してバイト配列を文字列にエンコードしようとしています。エンコードするとうまくいくように見えますが、デコードすると例外がスローされます。私は何を間違っていますか?

import org.springframework.security.crypto.codec.Base64;

byte[] bytes = new byte[]{1,2,3,4,5,6,7,8,9};
String stringToStore = Base64.encode(bytes).toString();
byte[] restoredBytes = Base64.decode(stringToStore.getBytes());

これが私が得ている例外です:

org.springframework.security.crypto.codec.InvalidBase64CharacterException: Bad Base64 input character decimal 91 in array position 0
at org.springframework.security.crypto.codec.Base64.decode(Base64.java:625)
at org.springframework.security.crypto.codec.Base64.decode(Base64.java:246)
4

9 に答える 9

17

試してみませんか...

byte[] bytes = new byte[]{1,2,3,4,5,6,7,8,9}; 
String stringToStore = new String(Base64.encode(bytes));
byte[] restoredBytes = Base64.decode(stringToStore.getBytes()); 
于 2012-09-06T12:57:43.390 に答える
7

Base64.encode(bytes).toString()期待する文字列を返しません。

使用する必要があります

new String(Base64.encode(bytes))

iccthedral が示唆するように。

于 2012-09-06T13:12:28.150 に答える
3
String stringToStore = Base64.encode(bytes).toString();

それはバイトを文字列に変えていません。これは、オブジェクトの Java の文字列表現です (たとえば、"[B@9a4d5c6")。iccthedral が提案することを実行し、バイトを String クラスに提供する必要があります。

于 2012-09-06T12:59:17.687 に答える
2

Android API 8 以降を使用している場合は、 にBase64ヘルパー クラスがありandroid.utilます。

String stringToStore =  Base64.encodeToString(cipherText, Base64.DEFAULT);
于 2014-09-23T16:00:02.463 に答える
1

最初にこれをパスワードに使用する場合、文字列に変換することはお勧めしません。文字列として使用するには、次のコード セグメントに従います

    byte[] バイト = 新しい byte[]{1,2,3,4,5,6,7,8,9};
    String stringToStore = new String(Base64.encode(bytes), "UTF-8");
    byte[] RestoreBytes = Base64.decode(stringToStore.getBytes());

于 2014-11-25T08:50:46.263 に答える
1

これは私のために働く:

        byte[] bytes = new byte[]{1, 2, 3, 4, 5, 6, 7, 8, 9};
        String stringToStore = Base64.encode(bytes);
        //System.out.println(stringToStore);//AQIDBAUGBwgJ
        byte[] restoredBytes = Base64.decode(stringToStore);
        //System.out.println(Arrays.toString(restoredBytes));//[1, 2, 3, 4, 5, 6, 7, 8, 9]

私はそれを少し編集しました:

  • を呼び出さないtoString()Stringください。encode(bytes)メソッドはStringすでに
  • コードを追加するだけで必要ないのに、なぜバイトに変換するのか ( Base64.decode(stringToStore.getBytes()))
于 2012-09-06T12:55:56.467 に答える
0

apacheコーデックからBase64を試し ましたが、結果は良好です。

    import org.apache.commons.codec.binary.Base64;
    byte[] bytes = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    Base64 base64 = new Base64();
    byte[] stringToStore = base64.encode(bytes);
    System.out.print(Arrays.toString(stringToStore));//[65, 81, 73, 68, 66, 65, 85, 71, 66, 119, 103, 74]
    byte[] restoredBytes = base64.decode(stringToStore);
    System.out.print(Arrays.toString(restoredBytes));//[1, 2, 3, 4, 5, 6, 7, 8, 9]
于 2012-09-06T13:14:50.883 に答える
0

base64 コンテンツを含むバイト配列をデコードするには、javax.xml.bind.DatatypeConverterを使用できます。それはかなりうまくいきます。バイナリ型の MongoDB 値をデコードするために使用します。

String testString = "hi, I'm test string";
byte[] byteArrayBase64 = org.apache.commons.codec.digest.DigestUtils.md5(testString);
String decoded = javax.xml.bind.DatatypeConverter.printBase64Binary(byteArrayBase64);
assert testString.equals(decoded);
于 2015-03-13T14:19:46.107 に答える
0

Base64.decode()返すようbyte\[\]です。を呼び出すtoString()と、「56AB0FC3...」のような配列のデフォルトの Java 記述が得られます。その変換は自分で行う必要があります。

同様に、への呼び出しgetBytes()は、あなたが考えていることをまったく実行していません。

于 2012-09-06T13:01:59.570 に答える