Base64编码的字符串在perl和Java中有所不同

时间:2015-05-31 08:33:19

标签: java perl base64

当我在java中将pdf文件编码为base64二进制文件(使用commons lib)时,我得到了#34;字符串(示例); SGVsbG8gV_29y-bGQ ="

但如果我使用perl对同一个文件进行编码,我就会得到#34; 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

enter image description here

// Perl

enter image description here

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

这可能是您在语言方面有不同输出的原因。 base64有各种各样的实现,使用各种实现可能会为您提供不同的结果。

我最好的建议是坚持一种实施方式。如果您必须使用各种语言,那么最好找到使用相同base64实现的两种语言的兼容模块/库。看看here可能对你有好处。

相关问题