Perl 和 Java 中的 Base64 编码字符串不同

Base64 encoded string differs in perl and Java

当我在 java 中将 pdf 文件编码为 base64 二进制文件(使用 commons lib)时,我得到了像 "SGVsbG8gV_29y-bGQ="

这样的字符串(样本)

但是如果我使用 perl 对同一个文件进行编码,我会得到 "SGVsbG8gV/29y+bGQ="

字符串的区别:/ 而不是 _,+ 而不是 -

为什么我会变成这样?或者,有什么方法可以在不替换字符串的情况下修复?

在 java

byte[] data;
        try (java.io.FileInputStream fin = new java.io.FileInputStream(new java.io.File("file.pdf"))) {
            data = new byte[fin.available()];
            fin.read(data);
        }
        return data;
System.out.println("ecncoded value is " + DatatypeConverter.printBase64Binary(data));

在 Perl 中

use MIME::Base64;

open (PDF, "file.pdf") or die "$!";

$raw_string = do{ local $/ = undef; <PDF>; };
$encoded = encode_base64( $raw_string );

print " \n";
print " $encoded ";

// Java

// Perl

我在这里引用维基百科 The particular set of 64 characters chosen to represent the 64 place-values for the base varies between implementations.

这可能是您在更改语言时输出不同的原因。目前有多种 base64 实现,使用不同的实现可能会为您提供不同的结果。

我最好的建议是坚持一种实施方式。如果您必须使用多种语言,那么最好在使用相同 base64 实现的两种语言中找到兼容的 modules/libraries。或许你可以看看here.

Java 代码为您提供 URL-安全的 base64,即输出可以在 URL 中使用。 Perl 版本不是。您可以盲目地将字符替换为其他值。