Base64 Java对字符串进行编码和解码

Sam*_*gha 149 java base64 encode decode

我想将一个字符串编码为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);
       }
    }
Run Code Online (Sandbox Code Playgroud)

有关如何实现这一点的任何想法?

谢谢...

Dar*_*ght 224

您可以使用以下方法:

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));
Run Code Online (Sandbox Code Playgroud)

希望这能回答你的疑问.

  • 我得到`方法encodeBase64(byte [])未定义类型Base64` (21认同)
  • 这个更好http://stackoverflow.com/a/13862852/2615737 (2认同)
  • @FranciscoCorralesMorales他正在使用org.apache.commons.codec.binary.Base64 (2认同)
  • @ RupertMadden-Abbott encodeBase64在java.util.Base64包下不可用.要使上面的代码有效,您必须从org.apache.commons.codec.binary.Base64导入Base64. (2认同)

小智 132

Java 8现在支持BASE64编码和解码.您可以使用以下类: java.util.Base64,java.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); 
Run Code Online (Sandbox Code Playgroud)

  • 什么时候使用填充vs没有填充? (20认同)
  • 从apache切换到java 8时要小心:org.apache.commons.codec.binary.Base64.decodeBase64也接受mime编码输入,但java.util.Base64.getDecoder不接受.如果您还想解码mime编码,则需要使用java.util.Base64.getMimeDecoder. (4认同)
  • @IgorGanapolsky 这里是什么是填充的答案?/sf/ask/285669191/ 它与用0字节填充字符串有关如果它很奇怪 (2认同)

noc*_*dib 51

接受的答案使用Apache Commons包,但这是我使用它的方式try/catch- 这至少可以在Java 6上使用:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

更好的方法是try/catch编码/解码步骤,但希望你能得到这个想法.

  • `java.util.Base64` 从 Java 8 开始可用,而不是 11。 (5认同)
  • 请注意,Java 11中删除了javax.xml.bind(JAXB)。 (2认同)

iam*_*ddy 23

对于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"));
}
Run Code Online (Sandbox Code Playgroud)


Yeh*_*tan 18

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

import android.util.Base64;

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

String stringFromBase = new String(Base64.decode(converted, Base64.DEFAULT));
Run Code Online (Sandbox Code Playgroud)

而已.单行编码和解码.


小智 7

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);
   }
}
Run Code Online (Sandbox Code Playgroud)