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 版本不是。您可以盲目地将字符替换为其他值。
当我在 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 版本不是。您可以盲目地将字符替换为其他值。