ich stehe hier vor einem scheinbar einfachem Problem, ich komme aber leider nicht darauf. Es werden aus einer Datei jeweils 32KB ausgelesen. Für diese sollen Stückchenweise die MD5 und SHA1-Summe berechnet werden. Die entsprechenden Funktionen dazu erwarten einen "String". Jetzt stehe ich vor dem Problem das ich das Byte Array nicht in ein String umwandeln kann.
procedure readInFile(FileName : String);
var
MyFile: file;
Data: array [0..32767] of Byte;
Chunk : String;
MD5Chunk, SHA1Chunk : String;
LeftFileSize: Integer;
begin
LeftFileSize := getFileSize(FileName);
AssignFile(MyFile, FileName);
FileMode := fmOpenRead;
Reset(MyFile, 1);
try
while not EOF(MyFile) do
begin
if LeftFileSize > 32768 then
begin
ShowMessage('Read '+IntToStr(SizeOf(Data))+' with Left: '+IntToStr(LeftFileSize));
BlockRead(MyFile, Data, SizeOf(Data));
end else
begin
ShowMessage('Read '+IntToStr(LeftFileSize)+' with Left: '+IntToStr(LeftFileSize));
BlockRead(MyFile, Data, LeftFileSize);
ShowMessage(IntToStr(Data[1]));
end;
//HIER Komme ich nicht weiter, "Chunk" muss irgendwie den 32KB String enthalten.
MD5Chunk := UpperCase(MD5Print((MD5String(Chunk))));
SHA1Chunk := UpperCase(SHA1(Chunk));
end;
finally
CloseFile(MyFile);
end;
end;
chickendev hat geschrieben:Wow!! So einfach war das!!
1000 Dank das hat mir sehr weitergeholfen !!!
So einfach ist das, wenn dein Byte-Array keine Null-Bytes (mit dem Wert 0) enthält. Diese Methode Wandelt deine Array von Bytes in ein Array von Zeichen um und verwendet dieses als Null-Terminierten-String. Da ist bei dem ersten Null-Byte Schluss (das ist bei einer Textdatei unüblich).
Wenn du auch diese Fälle beachten musst, solltest du dir eine Hash-Funktion suchen, die von Haus aus mit Byte-Arrays umgehen kann. Alternativ kannst du auch die Zeichenkette auf die Länge des Byte-Array setzen und den Inhalt mit move() kopieren.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
function SHA1 ( Data : String ) : String; //korrektes SHA1 - getestet
var
Hash: TDCP_sha1;
Digest: array[0..19] of byte; // RipeMD-160 produces a 160bit digest (20bytes)
Source: TFileStream;
i: integer;
s: string;
begin
Hash:= TDCP_sha1.Create(nil);
Hash.Init;
Hash.UpdateStr(Data);
Hash.Final(Output);
Hash.Free;
texto:='';
for i:=1 to 20 do
texto:=texto+inttohex(Output[i],1);
Result :=texto;
end;