为什么Perl MIME :: Base64在解码Base64编码的字符串时在LF字符之前插入CR字符,而它们在原始数据中不存在?

时间:2013-05-28 11:57:35

标签: perl character-encoding base64

为什么解码Base64编码字符串的Perl MIME :: Base64模块在原始数据中不存在LF字符之前插入CR字符?

输入:由以下十六进制字符串

描述的二进制文件

14 15 6A 48 E4 15 6A 32 E5 48 46 A A5 E3 88 43 18 A6 84 E3 51 3A 8A 0A 1A 3E E6 84 A6 1A 16 E8 46 84 A1 2E A3 5E 84 8A 4E 1A 35 E1 35 1E 84 A9 8E 46 54 44

这编码为Base64编码的字符串:

FBVqSOQVajLlSEYTpeOIQximhONROooKGj7mhKYaFuhGhKEuo16Eik4aNeE1HoSpjkZURA ==

我的用于解码的Perl脚本是

use MIME::Base64;
my $bin =  decode_base64('FBVqSOQVajLlSEYTpeOIQximhONROooKGj7mhKYaFuhGhKEuo16Eik4aNeE1HoSpjkZURA==');
open FH, ">test.bin" or die $!;
print FH $bin;
close FH;

输出:生成的文件'test.bin'具有以下十六进制字符串表示,

14 15 6A 48 E4 15 6A 32 E5 48 46 13 A5 E3 88 43 18 A6 84 E3 51 3A 8A 0D 0A 1A 3E E6 84 A6 1A 16 E8 46 84 A1 2E A3 5E 84 8A 4E 1A 35 E1 35 1E 84 A9 8E 46 54 44

请注意以粗体显示的十六进制数字,突出显示在原始数据中不存在的“0A”之前插入的附加“0D”字符。

我在Windows 7上使用Perl v5.14.2。

1 个答案:

答案 0 :(得分:1)

由于您使用的是Windows,因此您需要以二进制模式打开该文件句柄,以防止您的行结束被滥用。

open FH, ">test.bin" or die $!;
binmode FH;

您可以使用IO图层同时执行所有操作,也可以使用词法文件句柄,这比FH这样的包符号更好:

open my $fh, '>:raw', 'test.bin' or die $!;
print { $fh } $bin;

了解更多信息,请查看