2012-09-06 28 views
15

別のバイト配列ではなく、バイト配列からスターリングにBase64エンコーディングを行う必要があります。しかし、私がそれを解読するとき、私は例外を得る。ここにコードですStringを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) 
+2

あなたが役に立った場合は、回答の1つを受け入れる必要があります。 – jszakmeister

答えて

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()。 (いただきましたエラーが発生する可能性がある、これを呼び出す他の人が述べたように)encode(bytes)方法は、すでにそのちょうどより多くのコード(Base64.decode(stringToStore.getBytes())
+0

Base64クラスへのリンクを提供してください。encode()はbyte []ではなくStringを返します。 –

16

あなたが試みることができるが必要ではないのに、なぜバイトに変換

  • Stringを返します...文字列にバイトを回していない

    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()); 
    
  • 1
    String stringToStore = Base64.encode(bytes).toString(); 
    

    。オブジェクトのJavaの文字列表現です(たとえば、"[[email protected]")。 iccthedralが示唆していることを行い、バイトをStringクラスに提供する必要があります。

    0

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

    同様に、getBytes()へのあなたの電話は、あなたの考えを全くしていません。

    4

    Base64.encode(bytes).toString()は、期待するStringを返しません。

    iccthedralにより示唆されるようにあなたは

    new String(Base64.encode(bytes)) 
    

    を使用する必要があります。

    0

    Base64をapache codecから試しましたが、結果は正常です。

    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] 
    
    2

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

    String stringToStore = Base64.encodeToString(cipherText, Base64.DEFAULT); 
    
    1

    最初にパスワード用に使用している場合は、文字列に変換することはお勧めしません。文字列として使用するには、あなたがjavax.xml.bind.DatatypeConverterを使用することができますbase64でコンテンツをcontaisバイト配列を解読するには、次のコードセグメント

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

    に従ってください。それはかなりうまくいく。バイナリ型の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); 
    
    関連する問題