Perl 将二进制数据存储在_数据_句柄中

Perl 将二进制数据存储在_数据_句柄中,perl,Perl,在一个模块中,我需要一个用于某些操作的图像数据(BMP)。以下工作: my $pattern = Imager::Search::Pattern->new( driver => 'Imager::Search::Driver::BMP24', file => 'test.bmp', #load the image from a file ); 图像(test.bmp)对我来说是常量,所以希望将其直接存储在源代码中作为 my $image = ... t

在一个模块中,我需要一个用于某些操作的图像数据(BMP)。以下工作:

my $pattern = Imager::Search::Pattern->new(
     driver => 'Imager::Search::Driver::BMP24',
     file   => 'test.bmp', #load the image from a file
);
图像(
test.bmp
)对我来说是常量,所以希望将其直接存储在源代码中作为

my $image = ... the image data ... ;
或者在
\uuuu数据\uuuu
部分中


\uuuu data\uuuu
中存储二进制数据(如
test.bmp
)的推荐方法是什么?(2.3kb)。

您可能不想处理在源文件中存储原始二进制数据的麻烦,但这并不意味着您不能仍然使用将图像存储在
\uuuu数据段中的解决方案。您只需首先以纯文本格式对其进行编码,例如Base64

是这类事情的一个例子。有了它,就可以在
\uuuuu DATA\uuuu
部分的片段中嵌入模板和其他静态内容。如中所述,Base64编码数据是一种可能性

这一点是为了证明有时会使用这种方法。如果您想要实现一个使用这种方法的解决方案,您将使用核心Perl模块。下面是一个示例,其中一些任意的纯旧文本以Base64格式存储,并检索以供使用。然而,由于Base64编码可用于二进制数据,因此本示例可适用于存储图像

use MIME::Base64;

my $foo = do {
    local $/ = undef;
    decode_base64(<DATA>);
};

print "<<$foo>>\n";

__DATA__
SnVzdCBhbm90aGVyClBlcmwgaGFja2VyLA==
使用MIME::Base64;
我的$foo=do{
本地$/=undef;
解码_base64();
};
打印“\n”;
__资料__
SNVZDCBHBM90AGVYCLCMWGAGFJA2VYLA==
显然,这是一个正确的答案。您也可以使用十六进制而不是base64

为此,首先将映像的十六进制转储附加到模块源文件。例如,您可以使用
xxd

$ xxd -ps /path/to/image >> lib/My/Module.pm 或者,如果您想发出咕噜声:

my $png = pack 'H*',
          map { s{\s+}{}g; $_ }
          do { local $/; scalar <DATA> }
;
binmode STDOUT;
print $png;
更多详细信息,请参阅我的博客文章“”


另请参见和。

为什么?我可以想出各种有趣的方法,如果你真的存储二进制数据,而不是仅仅放十六进制表示,这可能会失败。请参阅。使用Base64编码,并使用核心模块Mime::Base64对其进行解码。这避免了将原始二进制数据直接放在源代码文件中的陷阱。我认为将图像作为单独的位图文件保存会更好,但您可能想看看哪个文件可以将二进制数据编码为可打印的ASCII字符。这是一个非常好的答案(与“不要这样做”相反)喜欢无益的评论)。完全符合我的要求。非常感谢。正确,用户将二进制数据编码为base64,然后将其放入
\uuuu data\uu
部分。它很容易解码,MIME::Base64模块随Perl一起提供。@SinanÜnür感谢您的澄清:)
my $png = pack 'H*',
          map { s{\s+}{}g; $_ }
          do { local $/; scalar <DATA> }
;
binmode STDOUT;
print $png;
my $png = pack 'H*', map s{\s+}{}gr, do { local $/; scalar <DATA> };