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

Base64编码字符串在perl和Java中有所不同,java,perl,base64,Java,Perl,Base64,当我在java中将pdf文件编码为base64二进制文件(使用commons lib)时,我得到了类似“SGVsbG8gV_29y-bGQ=”的字符串(示例) 但是如果我使用perl对同一个文件进行编码,我会得到“SGVsbG8gV/29y+bGQ=” 字符串中的差异:/而不是u,+而不是- 为什么我会变成这样?或者,有没有办法在不替换字符串的情况下进行修复? 在爪哇 byte[] data; try (java.io.FileInputStream fin = new java

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

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

字符串中的差异:/而不是u,+而不是-

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

在爪哇

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 ";
使用MIME::Base64;
打开(PDF,“file.PDF”)或死“$!”;
$raw_string=do{local$/=unde;;};
$encoded=encode_base64($raw_string);
打印“\n”;
打印“$encoded”;
//爪哇

//Perl


我在这里引用wikipedia
用于表示基的64位值的特定64个字符集在不同的实现中有所不同。

这可能是语言变化导致输出不同的原因。base64有多种实现,使用各种实现可能会给您带来不同的结果


我最好的建议是坚持一种执行方式。如果您必须使用不同的语言,那么最好在使用相同base64实现的两种语言中找到兼容的模块/库。您不妨看一看。

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

perl代码在哪里。请在询问时提供您的代码。@shivams添加了perl代码您是否尝试使用其他字符串测试此代码。几乎每个字符串都有相同的问题吗?@shivams实际上我正在将文件转换为base64字符串。我试过使用pdf、doc、rtf、txt文件。它们在perl和java base64编码方面都有所不同。明白了@普拉善对你有好处。我还学到了一些新东西。:)