Perl 解包和换行符

Posted

技术标签:

【中文标题】Perl 解包和换行符【英文标题】:Perl unpack and newline character 【发布时间】:2012-11-08 06:21:38 【问题描述】:

我正在使用解包功能将二进制文件的内容转换为十六进制。

我是这样做的:

#! /usr/bin/perl

use strict;
use warnings;

my $input=$ARGV[0];

open(INPUT,'<',$input) || die("Couldn't open the file, $input with error: $!\n");
my $value=<INPUT>;
$value=unpack("H*",$value);

print $value,"\n";

这会将二进制输入文件的内容打印为十六进制字符串。

但是,问题在于,在解析二进制文件的内容时,如果遇到字节 0xa(换行符),解包函数会在该点停止。

因此,我在 $value 变量中得到不完整的输出。

几个例子:

65 2E 0D 0D 0A 24 00 00 00 00 00 00 00 BA DC 95 DC FE BD

FE FF FF FF 07 00 00 00 08 00 00 00 09 00 00 00 0A 00 00 00 0B 00 00 00 0C 00

字节后的所有内容,0xa没有被unpack解析。

那么,有没有办法对完整的二进制文件使用 unpack 使其在遇到换行符时不会停止解析?

谢谢。

【问题讨论】:

好的,我自己找到了解决方案。我需要在读取文件之前启用 slurp 模式。本地 $/ 做到了 :) Neon Flash:您可以将其添加为您自己的答案并接受它。 【参考方案1】:

你怎么看

my $value = <INPUT>;

有吗?读一行,也就是读到0A。修复:

my $value;
 local $/; $value = <INPUT>; 

另外,你想添加

binmode(INPUT);

open之后。

【讨论】:

以上是关于Perl 解包和换行符的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Perl 的两个 arg open 似乎去掉了换行符?

Perl 不会在没有换行符的情况下打印多个变量

Perl 正则表达式多行匹配没有点

Perl one lines

perl 之 正则表达式 (简)

perl 第八弹 函数