Java中的Base64编码和解码字符串

187

我想将一个字符串编码为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);
       }
    }

你有关于如何实现这个的任何想法吗?


2
请参见以下链接,了解Java中的Base64编码:https://dev59.com/AWcs5IYBdhLWcg3wHwfU - Frederic Close
5
DataTypeConverter 运行良好,原帖作者只是顺序搞混了。应该像这样:String str = DatatypeConverter.printBase64Binary("user:123".getBytes()); String res = new String(DatatypeConverter.parseBase64Binary(str)); - mrts
1
parseBase64Binary() 用于解码,printBase64Binary() 用于编码。 - sagar vyas
6个回答

273

您可以使用以下方法:

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));
希望这回答了你的疑问。

29
我得到了“Base64类型没有定义encodeBase64(byte[])方法”的错误。 - Francisco Corrales Morales
2
这个更好:https://dev59.com/vWcs5IYBdhLWcg3w-YlD#13862852 - Francisco Corrales Morales
1
String str = Base64.encodeToString(strFinalXML.getBytes(), 0); //适用于Java 1.7+ - Abhijit Gujar
2
@FranciscoCorralesMorales 他正在使用 org.apache.commons.codec.binary.Base64。 - RavenMan
2
@RupertMadden-Abbott encodeBase64在java.util.Base64包下不可用。为了使上述代码正常工作,你需要从org.apache.commons.codec.binary.Base64导入Base64。 - ChandraBhan Singh
显示剩余3条评论

162

Java8现在支持BASE64编码和解码。您可以使用以下类:java.util.Base64java.util.Base64.Encoderjava.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); 

29
何时使用填充(padding)和何时不使用填充? - IgorGanapolsky
5
从apache转换到java 8时请注意:org.apache.commons.codec.binary.Base64.decodeBase64也接受mime编码的输入,但java.util.Base64.getDecoder不接受。如果您还想解码mime编码的内容,则需要使用java.util.Base64.getMimeDecoder。 - wdk
2
@IgorGanapolsky 这是关于填充(padding)的答案:https://dev59.com/am855IYBdhLWcg3w6Y1q 如果字符串长度为奇数,则需要使用0字节来填充。 - Khan

60

接受的答案使用了Apache Commons包,但是我使用Java原生库进行了操作。

Java 11及以上版本

import java.util.Base64;

public class Base64Encoding {

    public static void main(String[] args) {
        Base64.Encoder enc = Base64.getEncoder();
        Base64.Decoder dec = Base64.getDecoder();
        String str = "77+9x6s=";

        // encode data using BASE64
        String encoded = enc.encodeToString(str.getBytes());
        System.out.println("encoded value is \t" + encoded);

        // Decode data
        String decoded = new String(dec.decode(encoded));
        System.out.println("decoded value is \t" + decoded);
        System.out.println("original value is \t" + str);
    }
}

Java 6 - 10

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,但希望你能理解这个想法。

请注意,这在Android上不起作用。 - Mavamaarten
2
请注意,javax.xml.bind(JAXB)在Java 11中已被删除。 - Dennie
更新了。谢谢,Dennie。 - nocdib
7
java.util.Base64 在Java 8中就已经出现,而不是在Java 11中才出现。 - Isaac

28

对于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"));
}

对于那些现在正在查看此内容的人,“org.springframework.security.crypto.codec.Base64”已被弃用。 - Samakaab

23
以下是一个好的解决方案 -
import android.util.Base64;

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

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

就是这样。一行代码进行编码和解码。


它被重命名为java.util.Base64。 - eastwater
很棒的解决方案,没有使用任何库! - Aziz Yokubjonov

8
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);
   }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接