web-dev-qa-db-ja.com

Base64 Javaは文字列をエンコードおよびデコードします

文字列をbase64にエンコードし、それをソケットを介して転送してからデコードし直します。しかし、デコードした後でそれは異なる答えを与えます。以下は私のコードで、結果は "77 + 9x6s ="です

import javax.xml.bind.DatatypeConverter;

    public class f{

       public static void main(String a[]){

          String str = new String(DatatypeConverter.parseBase64Binary("user:123"));
          String res = DatatypeConverter.printBase64Binary(str.getBytes());
          System.out.println(res);
       }
    }

これを実装する方法についての任意のアイデア?

ありがとうございました...

142

あなたは以下のアプローチを使うことができます:

import org.Apache.commons.codec.binary.Base64;

// Encode data on your side using BASE64
byte[] bytesEncoded = Base64.encodeBase64(str.getBytes());
System.out.println("encoded value is " + new String(bytesEncoded));

// Decode data on other side, by processing encoded data
byte[] valueDecoded = Base64.decodeBase64(bytesEncoded);
System.out.println("Decoded value is " + new String(valueDecoded));

これがあなたの疑問に答えることを願っています。

215
Dark Knight

Java 8は現在BASE64エンコードとデコードをサポートしています。次のクラスを使用できます:Java.util.Base64Java.util.Base64.EncoderおよびJava.util.Base64.Decoder

使用例

// encode with padding
String encoded = Base64.getEncoder().encodeToString(someByteArray);

// encode without padding
String encoded = Base64.getEncoder().withoutPadding().encodeToString(someByteArray);

// decode a String
byte [] barr = Base64.getDecoder().decode(encoded); 
124
Lakshma Gopidi

受け入れられた答えはApache Commonsパッケージを使います、しかしこれは私がjavax.xml.bind.DatatypeConverterを使ってそれをした方法です - これは少なくともJava 6からうまくいきます:

import Java.io.UnsupportedEncodingException;    
import javax.xml.bind.DatatypeConverter;

public class EncodeString64 {
    public static void main(String[] args) throws UnsupportedEncodingException {

        String str = "77+9x6s=";
        // encode data using BASE64
        String encoded = DatatypeConverter.printBase64Binary(str.getBytes());
        System.out.println("encoded value is \t" + encoded);

        // Decode data 
        String decoded = new String(DatatypeConverter.parseBase64Binary(encoded));
        System.out.println("decoded value is \t" + decoded);

        System.out.println("original value is \t" + str);
    }
}

もっと良い方法はエンコーディング/デコーディングのステップをtry/catchすることですが、うまくいけばあなたはアイデアを得ます。

47
nocdib

Springユーザー向けに、Spring Securityはorg.springframework.security.crypto.codecパッケージにBase64クラスを持っています。これはBase64のエンコードとデコードにも使用できます。例.

 public static String base64Encode(String token) {
    byte[] encodedBytes = Base64.encode(token.getBytes());
    return new String(encodedBytes, Charset.forName("UTF-8"));
}


public static String base64Decode(String token) {
    byte[] decodedBytes = Base64.decode(token.getBytes());
    return new String(decodedBytes, Charset.forName("UTF-8"));
}
23
iamiddy

以下は良い解決策です -

import Android.util.Base64;

String converted = Base64.encodeToString(toConvert.toString().getBytes(), Base64.DEFAULT);

String stringFromBase = new String(Base64.decode(converted, Base64.DEFAULT));

それでおしまい。単一行のエンコードとデコード。

18
Yehonatan
import javax.xml.bind.DatatypeConverter;

public class f{

   public static void main(String a[]){

      String str = new String(DatatypeConverter.printBase64Binary(new String("user:123").getBytes()));
      String res = DatatypeConverter.parseBase64Binary(str);
      System.out.println(res);
   }
}
7
Tahong Shen