java - 如何使用 org.apache.commons.codec.binary.base64 对java对象进行base64编码?

  显示原文与译文双语对照的内容
0 0

我一直在尝试执行对象序列化和base64编码结果。 它适用于太阳:


Bean01 bean01 = new Bean01();
bean01.setDefaultValues();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
new ObjectOutputStream( baos ).writeObject( bean01 );
System.out.println(Base64.encode(baos.toByteArray()));

这很好。不过,我想用 org.apache.commons.codec.binary.base64, 来做同样的事情,但是


System.out.println(org.apache.commons.codec.binary.Base64.encodeBase64(baos.toByteArray()));

不返回相同的字符串。 使用apaches编码器实现字节缓冲区正确base64编码的正确方法?

时间: 原作者:

0 0

实际上 commons-codec 版本和特定的太阳内部版本使用给相同的结果。 我认为你认为它们是在给出不同的版本,因为在执行以下操作时,你隐式地调用了数组上的toString():


System.out.println(org.apache.commons.codec.binary.Base64.encodeBase64(baos.toByteArray()));

绝对不会打印出数组内容。 相反,它只输出数组引用的地址。

我已经编写了以下程序来测试编码器。 从下面的输出中可以看到,给出了相同的结果:


import java.util.Random;

public class Base64Stuff
{
 public static void main(String[] args) {
 Random random = new Random();
 byte[] randomBytes = new byte[32];
 random.nextBytes(randomBytes);

 String internalVersion = com.sun.org.apache.xerces.internal.impl.dv.util.Base64.encode(randomBytes);
 byte[] apacheBytes = org.apache.commons.codec.binary.Base64.encodeBase64(randomBytes);
 String fromApacheBytes = new String(apacheBytes);

 System.out.println("Internal length =" + internalVersion.length());
 System.out.println("Apache bytes len=" + fromApacheBytes.length());
 System.out.println("Internal version = |" + internalVersion +"|");
 System.out.println("Apache bytes = |" + fromApacheBytes +"|");
 System.out.println("internal equal apache bytes?:" + internalVersion.equals(fromApacheBytes));
 }
}

下面是运行它的输出:


Internal length = 44
Apache bytes len= 44
Internal version = |Kf0JBpbxCfXutxjveYs8CXMsFpQYgkllcHHzJJsz9+g=|
Apache bytes = |Kf0JBpbxCfXutxjveYs8CXMsFpQYgkllcHHzJJsz9+g=|
internal equal apache bytes?: true

原作者:
0 0

commons-codec主页:

编解码器是为了将开发精力集中在Base64编码器的一个明确实现上。 在编码编码的时候,大约有 34个不同的Java类处理基础存储库的CVS上的Base64编码分布。 Jakarta Tomcat项目中的开发人员已经实现了一个原始版本的Base64编码器,它已经被共享的HttpClient和 Apache XML XML-RPC 复制到项目子工程的。 近一年后,两个分支版本的Base64在彼此之间有明显的。 XML-RPC 已经应用了许多补丁和补丁,这些补丁并没有应用到 Commons 。 不同的子项目在不同级别与 RFC 2045实现不同的实现。

我认为你的问题是"不同级别"的。

我的建议:选择一个base64编码/解码器并坚持

原作者:
...