如何在Delphi中读取一个视频文件的前64kb和后64kb?

4
我希望您能够使用字幕API,它需要视频文件的前64kb和后64kb的md5哈希值。我知道如何进行md5哈希,只是想知道如何获取128kb的数据。
以下是Java中解决问题的方法,但我无法在Delphi中实现。 如何在Java中读取视频文件的前64kb和后64kb? 目前我的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;

我在使用Delphi XE8开发时,调用API url ,但是得到的MD5哈希值与官方API不符。


如果您检查了Read的返回值或使用了ReadBuffer,您就会发现故障。 - David Heffernan
1个回答

7
那个API使用的哈希函数描述如下:

我们的哈希是通过取视频文件的前64kb和后64kb,将它们全部放在一起并生成结果数据(128kb)的md5而组成的。

我看到你的代码有几个问题。你正在对文件流进行哈希,而不是你的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;

非常感谢您的耐心等待。一切都按预期进行。我的错,因为我是一名学生。 - Rabi Jayasawal
需要检查输入流至少为128KB长吗? - David Heffernan
@David,添加了最小检查以避免由较小的文件大小(即64kB)引起的流读取错误。 - TLama

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接