2015-05-13 32 views
4

我想使用字幕API。它需要視頻文件的第一個和最後一個64kb的md5散列。我知道如何做md5部分只是想知道我將如何實現128kb的數據。如何在Delphi中讀取視頻文件的第一個和最後一個64kb?

下面是在Java中我無法實現的問題的解決方案。 How to read first and last 64kb of a video file in Java?

我的Delphi代碼至今:

function TSubdbApi.GetHashFromFile(const AFilename: string): string; 
var 
    Md5: TIdHashMessageDigest5; 
    Filestream: TFileStream; 
    Buffer: TByteArray; 
begin 
    Md5 := TIdHashMessageDigest5.Create; 
    Filestream := TFileStream.Create(AFilename, fmOpenRead, fmShareDenyWrite); 
    try 
    if Filestream.Size > 0 then begin 
     Filestream.Read(Buffer, 1024 * 64); 
     Filestream.Seek(64, soFromEnd); 
     Filestream.Read(Buffer, 1024 * 64); 
     Result := Md5.HashStreamAsHex(Filestream); 
    end; 
    finally 
    Md5.Free; 
    Filestream.Free; 
    end; 
end; 

由官方API指出,我沒有得到準確的MD5哈希值。 API url here。我正在使用Delphi XE8。

+0

你會發現故障了,你查讀的返回值,或使用ReadBuffer –

回答

7

的由API使用hash function被描述爲:

我們的散列是通過取第一和 視頻文件的最後64KB,把所有在一起,併產生所得到的 數據的MD5組成(128KB)。

我可以在代碼中看到一些問題。您正在散列文件流,而不是您的Buffer陣列。除了通過後續從文件流讀取覆蓋該數組。並且您試圖僅查找64個字節,並且超出流的末尾(您需要使用負值從流尾查找)。嘗試這樣的事情,而不是:

type 
    ESubDBException = class(Exception); 

function TSubdbApi.GetHashFromFile(const AFileName: string): string; 
const 
    KiloByte = 1024; 
    DataSize = 64 * KiloByte; 
var 
    Digest: TIdHashMessageDigest5; 
    FileStream: TFileStream; 
    HashStream: TMemoryStream; 
begin 
    FileStream := TFileStream.Create(AFileName, fmOpenRead, fmShareDenyWrite); 
    try 
    if FileStream.Size < DataSize then 
     raise ESubDBException.Create('File is smaller than the minimum required for ' + 
     'calculating API hash.'); 

    HashStream := TMemoryStream.Create; 
    try 
     HashStream.CopyFrom(FileStream, DataSize); 
     FileStream.Seek(-DataSize, soEnd); 
     HashStream.CopyFrom(FileStream, DataSize); 

     Digest := TIdHashMessageDigest5.Create; 
     try 
     HashStream.Position := 0; 
     Result := Digest.HashStreamAsHex(HashStream); 
     finally 
     Digest.Free; 
     end; 
    finally 
     HashStream.Free; 
    end; 
    finally 
    FileStream.Free; 
    end; 
end; 
+0

非常感謝您的耐心。按預期工作。作爲一名學生,我不好。 –

+0

不需要檢查輸入流是否至少有128KB長? –

+0

@David,增加了最小檢查,以避免由較小的文件大小(這是64kB)造成的流讀取錯誤。 – TLama

相關問題