【问题标题】:Why does Perl MIME::Base64 insert CR characters before LF characters on decoding Base64-encoded strings when they aren't present in the original data?当原始数据中不存在 Perl MIME::Base64 解码 Base64 编码字符串时,为什么在 LF 字符之前插入 CR 字符?
【发布时间】:2013-05-28 11:57:34
【问题描述】:

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

输入:由以下十六进制字符串描述的二进制文件,

14 15 6A 48 E4 15 6A 32 E5 48 46 13 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。

【问题讨论】:

    标签: perl character-encoding base64


    【解决方案1】:

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

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

    您可以使用 IO 层一次完成所有操作,也可以使用词法文件句柄,这比 FH 之类的包符号更好:

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

    欲了解更多信息,请查看

    【讨论】:

    • 太好了,问题解决了!感谢您提供有关如何使用两种类型的文件句柄设置二进制模式的信息。
    猜你喜欢
    • 2015-01-31
    • 2020-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-19
    • 2018-01-27
    • 1970-01-01
    相关资源
    最近更新 更多