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

3
当我在Java中使用commons库将PDF文件编码为base64二进制格式时,我得到了一个字符串(示例):“SGVsbG8gV_29y-bGQ=”。但是如果我使用Perl编码相同的文件,我会得到像“SGVsbG8gV/29y+bGQ=”这样的结果。两个字符串的区别是:斜杠“/”代替下划线“_”,加号“+”代替减号“-”。为什么会这样?还有没有不需要替换字符串的方法来解决这个问题?
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

这是一个Java编程语言的Logo

// Perl

这是一个Perl编程语言的Logo


你的 Perl 代码在哪里?请在询问时提供你的代码。 - shivams
@shivams 添加了 Perl 代码。 - prashanth-g
你尝试使用其他字符串进行测试了吗?几乎每个字符串都会出现这个问题吗? - shivams
@shivams 实际上我正在将文件转换为base64字符串。我已经尝试过pdf、doc、rtf、txt文件。它们在perl和java的base64编码中都有所不同。 - prashanth-g
2个回答

2
Java代码提供给你URL安全的base64编码,也就是输出结果可以在URL中使用。Perl版本则不行。你可以直接用其他值替换字符。

0

我在这里引用维基百科的话:用于表示基数64个位置值的特定64个字符集合因实现而异。

这可能是你在更改语言时产生不同输出的原因。有各种各样的base64实现存在,并且使用不同的实现可能会提供不同的结果。

我最好的建议是坚持一种实现方式。如果你必须使用各种语言,那么最好找到两种语言中使用相同的base64实现的兼容模块/库。你可以在这里看看。


明白了。http://search.cpan.org/~kazuho/MIME-Base64-URLSafe-0.01/lib/MIME/Base64/URLSafe.pm - prashanth-g
@Prashanth,你做得很好。同时我也学到了新东西。 :) - shivams

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接