2014-02-28 39 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

相關問題