Java中的Base64编码

我正在使用Eclipse,我有以下代码行:

wr.write(new sun.misc.BASE64Encoder().encode(buf)); 

Eclipse将这一行标记为错误。 我导入了所需的库:

 import sun.misc.BASE64Encoder; import sun.misc.BASE64Decoder; 

但是,再次,他们都显示为错误。 我在这里find了一个类似的post: 导入sun.misc.BASE64Encoder导致在Eclipse中编译错误

我使用Apache Commons作为解决scheme,其中包括:

 import org.apache.commons.*; 

并导入从http://commons.apache.org/codec/下载的JAR文件

但问题仍然存在,Eclipse仍然显示了前面提到的错误; 请指教。

你需要改变你的类的导入:

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

然后将您的类更改为使用Base64类。

以下是一些示例代码:

 byte[] encodedBytes = Base64.encodeBase64("Test".getBytes()); System.out.println("encodedBytes " + new String(encodedBytes)); byte[] decodedBytes = Base64.decodeBase64(encodedBytes); System.out.println("decodedBytes " + new String(decodedBytes)); 

然后阅读为什么你不应该使用sun。*包 。


更新(16/12/2016)

你现在可以用java.util.Base64与Java8。 首先,像平常一样导入它:

 import java.util.Base64; 

然后使用Base64静态方法如下:

 byte[] encodedBytes = Base64.getEncoder().encode("Test".getBytes()); System.out.println("encodedBytes " + new String(encodedBytes)); byte[] decodedBytes = Base64.getDecoder().decode(encodedBytes); System.out.println("decodedBytes " + new String(decodedBytes)); 

有关更多信息,请参阅Javadocs for Base64: https : //docs.oracle.com/javase/8/docs/api/java/util/Base64.html

使用Java 8从来没有太迟的参与有趣的类: java.util.Base64

您也可以使用base64编码进行转换。 要做到这一点,你可以使用javax.xml.bind.DatatypeConverter#printBase64Binary方法

例如:

 byte[] salt = new byte[] { 50, 111, 8, 53, 86, 35, -19, -47 }; System.out.println(DatatypeConverter.printBase64Binary(salt)); 

在Java 8中,它可以完成

 Base64.getEncoder().encodeToString(string.getBytes(StandardCharsets.UTF_8)) 

这里是一个简短的,完整的例子

 import java.nio.charset.StandardCharsets; import java.util.Base64; public class Temp { public static void main(String... args) throws Exception { final String s = "old crow medicine show"; final byte[] authBytes = s.getBytes(StandardCharsets.UTF_8); final String encoded = Base64.getEncoder().encodeToString(authBytes); System.out.println(s + " => " + encoded); } } 

给出输出

 old crow medicine show => b2xkIGNyb3cgbWVkaWNpbmUgc2hvdw== 

Google Guava是对base64数据进行编码和解码的不错select:

POMconfiguration:

 <dependency> <artifactId>guava</artifactId> <groupId>com.google.guava</groupId> <type>jar</type> <version>14.0.1</version> </dependency> 

示例代码:

 String inputContent = "Hello Việt Nam"; String base64String = BaseEncoding.base64().encode(inputContent.getBytes("UTF-8")); //decode System.out.println("Base64:" + base64String);//SGVsbG8gVmnhu4d0IE5hbQ== byte[] contentInBytes = BaseEncoding.base64().decode(base64String); System.out.println("Source content: " + new String(contentInBytes, "UTF-8"));//Hello Việt Nam 

Eclipse为您提供了一个错误/警告,因为您正尝试使用特定于JDK供应商的内部类,而不是公共API的一部分。 Jakarta Commons提供了自己的base64编解码器的实现,当然这个编解码器位于不同的包中。 删除这些导入并让Eclipse为您导入正确的Commons类。

要将其转换,您需要Encoder&Decoder,您将从http://www.source-code.biz/base64coder/java/获得。; 这是您将需要的文件Base64Coder.java 。

现在按照您的要求访问这个类,您将需要下面的类:

 import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.FileReader; import java.io.FileWriter; import java.io.InputStream; import java.io.IOException; import java.io.OutputStream; public class Base64 { public static void main(String args[]) throws IOException { /* * if (args.length != 2) {System.out.println( * "Command line parameters: inputFileName outputFileName"); * System.exit(9); } encodeFile(args[0], args[1]); */ File sourceImage = new File("back3.png"); File sourceImage64 = new File("back3.txt"); File destImage = new File("back4.png"); encodeFile(sourceImage, sourceImage64); decodeFile(sourceImage64, destImage); } private static void encodeFile(File inputFile, File outputFile) throws IOException { BufferedInputStream in = null; BufferedWriter out = null; try { in = new BufferedInputStream(new FileInputStream(inputFile)); out = new BufferedWriter(new FileWriter(outputFile)); encodeStream(in, out); out.flush(); } finally { if (in != null) in.close(); if (out != null) out.close(); } } private static void encodeStream(InputStream in, BufferedWriter out) throws IOException { int lineLength = 72; byte[] buf = new byte[lineLength / 4 * 3]; while (true) { int len = in.read(buf); if (len &lt;= 0) break; out.write(Base64Coder.encode(buf, 0, len)); out.newLine(); } } static String encodeArray(byte[] in) throws IOException { StringBuffer out = new StringBuffer(); out.append(Base64Coder.encode(in, 0, in.length)); return out.toString(); } static byte[] decodeArray(String in) throws IOException { byte[] buf = Base64Coder.decodeLines(in); return buf; } private static void decodeFile(File inputFile, File outputFile) throws IOException { BufferedReader in = null; BufferedOutputStream out = null; try { in = new BufferedReader(new FileReader(inputFile)); out = new BufferedOutputStream(new FileOutputStream(outputFile)); decodeStream(in, out); out.flush(); } finally { if (in != null) in.close(); if (out != null) out.close(); } } private static void decodeStream(BufferedReader in, OutputStream out) throws IOException { while (true) { String s = in.readLine(); if (s == null) break; byte[] buf = Base64Coder.decodeLines(s); out.write(buf); } } } 

在Android中,您可以将您的位图转换为Base64上传到服务器/ Web服务。

 Bitmap bmImage = //Data ByteArrayOutputStream baos = new ByteArrayOutputStream(); bmImage.compress(Bitmap.CompressFormat.JPEG, 100, baos); byte[] imageData = baos.toByteArray(); String encodedImage = Base64.encodeArray(imageData); 

这个“encodedImage”是你的图像的文本表示。 您可以将其用于上传目的或直接在HTML页面中进行浸入( 参考 ):

 <img alt="" src="data:image/png;base64,<?php echo $encodedImage; ?>" width="100px" /> <img alt="" src="data:image/png;base64,/9j/4AAQ...........1f/9k=" width="100px" /> 

文档: http : //dwij.co.in/java-base64-image-encoder

apache commons有很好的base64实现。 你可以像这样简单地做到这一点

 // encrypt data on your side using BASE64 byte[] bytesEncoded = Base64.encodeBase64(str .getBytes()); System.out.println("ecncoded value is " + new String(bytesEncoded )); // Decrypt data on other side, by processing encoded data byte[] valueDecoded= Base64.decodeBase64(bytesEncoded ); System.out.println("Decoded value is " + new String(valueDecoded)); 

你可以在http://faisalbhagat.blogspot.com/2014/06/base64-encoding-using-java-and.htmlfind关于base64编码的更多细节。;

对于Java 6-7,最好的select是从Android存储库借用代码。 它没有依赖关系。

https://github.com/android/platform_frameworks_base/blob/master/core/java/android/util/Base64.java

在Android上,使用android.util.Base64工具类的静态方法。 引用的文档说Base64类是在API级别8(Froyo)中添加的。

 import android.util.Base64; byte[] encodedBytes = Base64.encode("Test".getBytes()); Log.d("tag", "encodedBytes " + new String(encodedBytes)); byte[] decodedBytes = Base64.decode(encodedBytes); Log.d("tag", "decodedBytes " + new String(decodedBytes)); 

Java 8的简单例子:

 import java.util.Base64; String str = "your string"; String encodedStr = Base64.getEncoder().encodeToString(str.getBytes("utf-8")); 

在Java 7中我编写了这个方法

 import javax.xml.bind.DatatypeConverter; public static String toBase64(String data) { return DatatypeConverter.printBase64Binary(data.getBytes()); } 

如果你至less使用Spring框架4.1版,你可以使用org.springframework.util.Base64Utils类:

 byte[] raw = { 1, 2, 3 }; String encoded = Base64Utils.encodeToString(raw); byte[] decoded = Base64Utils.decodeFromString(encoded); 

它将委托给Java 8的Base64,Apache Commons Codec或JAXB DatatypeConverter,具体取决于可用的内容。

我试着用下面的代码片断。 它运作良好。 🙂

 com.sun.org.apache.xml.internal.security.utils.Base64.encode("The string to encode goes here"); 

如果您坚持使用早于Java版本的Java,但已经使用适用于Java的AWS开发工具包 ,则可以使用com.amazonaws.util.Base64 。

这里是我的两分钱… Java 8确实包含了自己的Base64实现。 但是,我发现一个有点令人不安的差异。 为了说明,我将提供一个代码示例:

我的CODEC包装:

 public interface MyCodec { static String apacheDecode(String encodedStr) { return new String(Base64.decodeBase64(encodedStr), Charset.forName("UTF-8")); } static String apacheEncode(String decodedStr) { byte[] decodedByteArr = decodedStr.getBytes(Charset.forName("UTF-8")); return Base64.encodeBase64String(decodedByteArr); } static String javaDecode(String encodedStr) { return new String(java.util.Base64.getDecoder().decode(encodedStr), Charset.forName("UTF-8")); } static String javaEncode(String decodedStr) { byte[] decodedByteArr = decodedStr.getBytes(Charset.forName("UTF-8")); return java.util.Base64.getEncoder().encodeToString(decodedByteArr); } } 

testing类:

 public class CodecDemo { public static void main(String[] args) { String decodedText = "Hello World!"; String encodedApacheText = DefaultR3Codec.apacheEncode(decodedText); String encodedJavaText = DefaultR3Codec.javaEncode(decodedText); System.out.println("Apache encoded text: " + DefaultR3Codec.apacheEncode(encodedApacheText)); System.out.println("Java encoded text: " + DefaultR3Codec.javaEncode(encodedJavaText)); System.out.println("Encoded results equal: " + encodedApacheText.equals(encodedJavaText)); System.out.println("Apache decode Java: " + DefaultR3Codec.apacheDecode(encodedJavaText)); System.out.println("Java decode Java: " + DefaultR3Codec.javaDecode(encodedJavaText)); System.out.println("Apache decode Apache: " + DefaultR3Codec.apacheDecode(encodedApacheText)); System.out.println("Java decode Apache: " + DefaultR3Codec.javaDecode(encodedApacheText)); } } 

OUTPUT:

 Apache encoded text: U0dWc2JHOGdWMjl5YkdRaA0K Java encoded text: U0dWc2JHOGdWMjl5YkdRaA== Encoded results equal: false Apache decode Java: Hello World! Java decode Java: Hello World! Apache decode Apache: Hello World! Exception in thread "main" java.lang.IllegalArgumentException: Illegal base64 character d at java.util.Base64$Decoder.decode0(Base64.java:714) at java.util.Base64$Decoder.decode(Base64.java:526) at java.util.Base64$Decoder.decode(Base64.java:549) 

请注意,Apache编码文本最后包含更多换行符(空格)。 因此,为了让我的编解码器在不考虑Base64实现的情况下得到相同的结果,我必须在Apache编码的文本上调用trim() 。 在我的情况下,我只是将上述方法调用添加到我的CODEC的apacheDecode() ,如下所示:

 return Base64.encodeBase64String(decodedByteArr).trim(); 

一旦做出这个改变,结果就是我期望的结果:

 Apache encoded text: U0dWc2JHOGdWMjl5YkdRaA== Java encoded text: U0dWc2JHOGdWMjl5YkdRaA== Encoded results equal: true Apache decode Java: Hello World! Java decode Java: Hello World! Apache decode Apache: Hello World! Java decode Apache: Hello World! 

也许有人可以评论为什么这是,但我发现我的解决方法,作为一个可以接受的妥协。

 public class EncryptionDecrption { private static final String ALGO = "AES"; private static final byte[] keyValue = new byte[]{'T', 'h', 'e', 'R', 'o', 'o', 'K', 'n', 'a', 't','E','n', 'i', 'r','i','n'}; public EncryptionDecrption(){ } public static String setEncryptedString(String data) throws Exception { Key key = getKey(); Cipher cipher = Cipher.getInstance(ALGO); cipher.init(Cipher.ENCRYPT_MODE, key); byte[] encryptedValue = cipher.doFinal(data.getBytes("UTF-8")); return Base64.encodeToString(encryptedValue, Base64.DEFAULT); } public static String getDecryptedValue(String data) throws Exception { if(data != null) { Key key = getKey(); Cipher cipher = Cipher.getInstance(ALGO); cipher.init(Cipher.DECRYPT_MODE, key); byte[] decodebyte = Base64.decode(data.getBytes("UTF-8"), Base64.DEFAULT); byte[] decValue = cipher.doFinal(decodebyte); return new String(decValue); } return null; } private static Key getKey() throws Exception { return new SecretKeySpec(keyValue, ALGO); } } 

它在Android中适用于我。