【问题标题】:Base64 Java encode and decode a string [duplicate]Base64 Java编码和解码字符串[重复]
【发布时间】:2025-12-30 08:40:07
【问题描述】:

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

你知道如何实现吗?

【问题讨论】:

  • DataTypeConverter 工作得很好,原来的海报只是混合了顺序。它应该是这样的:String str = DatatypeConverter.printBase64Binary("user:123".getBytes());String res = new String(DatatypeConverter.parseBase64Binary(str));
  • parseBase64Binary() 用于解码,printBase64Binary() 用于编码。

标签: java base64 decode encode


【解决方案1】:

您可以使用以下方法:

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

希望这能解答您的疑问。

【讨论】:

  • 我收到The method encodeBase64(byte[]) is undefined for the type Base64
  • 字符串 str =Base64.encodeToString(strFinalXML.getBytes(), 0); //对于java 1.7 +
  • @FranciscoCorralesMorales 他正在使用 org.apache.commons.codec.binary.Base64
  • @RupertMadden-Abbott encodeBase64 在 java.util.Base64 包下不可用。要使上述代码正常工作,您必须从 org.apache.commons.codec.binary.Base64 导入 Base64
【解决方案2】:

以下是一个很好的解决方案-

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。
  • 没有任何库的绝佳解决方案!
【解决方案3】:

对于 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' 已被弃用
【解决方案4】:

Java 8 现在支持 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); 

【讨论】:

  • 何时使用有填充与无填充??
  • 从 apache 切换到 java 8 时要小心:org.apache.commons.codec.binary.Base64.decodeBase64 也接受 mime 编码输入,但 java.util.Base64.getDecoder 不接受。如果您还想解码 mime 编码,则需要使用 java.util.Base64.getMimeDecoder。
  • @IgorGanapolsky 这是填充的答案? *.com/questions/4080988/… 如果它是奇数,它与用 0 字节填充字符串有关
【解决方案5】:
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);
   }
}

【讨论】:

    【解决方案6】:

    接受的答案使用 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。
    • 请注意,Java 11 中删除了 javax.xml.bind (JAXB)。
    • 已更新。谢谢,丹尼。
    • java.util.Base64 从 Java 8 开始可用,而不是 11。