2014-02-28 37 views
2


hexdigest产生在linux不同的价值观和Windows相同的文件

我使用摘要:: MD5模块,并在hexdigest用于Windows和Linux返回不同的值。

请帮我解决这个问题。

use Digest::MD5; 
my $ctx=Digest::MD5->new(); 
open RD, "input.txt"; 
$ctx->addfile(*RD); 
close RD; 
print $ctx->hexdigest; 

input.txt的文件有如下内容:

hello 

输出:窗户

5d41402abc4b2a76b9719d911017c592 

输出:Linux的

af5597c29467a96523a70787c319f4db 

谢谢,
Saravanan

+1

你怎么知道那两个'input.txt'是相同的? –

+2

@leeduhem他可以md5他们来验证! – RobEarl

+1

@RobEarl是的,他可以。但他不相信MD5的结果。 –

回答

6

据提问者给出的意见,在Windows产生input.txt,然后被拷贝到Linux的话,我相信这个问题是由Windows和Linux结束行之间的差异造成的,在Windows中,行结束符是'\ r \ n',在Linux'\ n'中。因此,使用binmode()将文件处理程序设置为二进制模式应该能够解决此问题,如Digest::MD5的示例中所建议的那样。

这应该可以解决这个问题:

#!/usr/bin/perl 

use warnings; 
use strict; 

use Digest::MD5; 

open my $fh, '<', 'input.txt' or die "Cannot open input.txt: $!"; 
binmode $fh, ':raw'; # <==== NOTE this binmode() 

my $md5 = Digest::MD5->new; 
$md5->addfile($fh); 
print $md5->hexdigest, "\n"; 
close $fh; 
+0

谢谢我在windows中添加binmode后尝试工作我在windows和linux中添加binmode我现在删除了binmode我得到的值相同。 – Saravanan

+2

@Saravanan不需要在Windows版本脚本中删除'binmode()'。 –

+2

你可能更喜欢'binmode $ file','raw''来使访问模式显式化。无论如何,'$ file'对任何事物来说都是一个糟糕的名字。它可能是一个文件名字符串,一个文件路径字符串,或者像这里一样,是一个文件句柄。我建议至少有'$ fn','$ path','$ fh'。 – Borodin

相关问题