Binäres Byte-Array in String zum berechnen der MD5/SHA1

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
chickendev
Beiträge: 37
Registriert: Do 23. Feb 2012, 03:41

Binäres Byte-Array in String zum berechnen der MD5/SHA1

Beitrag von chickendev »

Hi,

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.

:-)

Code: Alles auswählen

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;

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Binäres Byte-Array in String zum berechnen der MD5/SHA1

Beitrag von Socke »

Code: Alles auswählen

var
  data: array[0..1] of byte;
  str: String;
begin
  str := PChar(@data[0]);
end;
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

chickendev
Beiträge: 37
Registriert: Do 23. Feb 2012, 03:41

Re: Binäres Byte-Array in String zum berechnen der MD5/SHA1

Beitrag von chickendev »

Socke hat geschrieben:

Code: Alles auswählen

var
  data: array[0..1] of byte;
  str: String;
begin
  str := PChar(@data[0]);
end;
Wow!! So einfach war das!! :)

1000 Dank das hat mir sehr weitergeholfen !!! :-)

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Binäres Byte-Array in String zum berechnen der MD5/SHA1

Beitrag von Socke »

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

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Binäres Byte-Array in String zum berechnen der MD5/SHA1

Beitrag von mschnell »

Es ist sogar noch einfacher.

Soweit ich mich erinnere ist in der LCL eine Methode zur Berechnung der MD5.

-Michael

chickendev
Beiträge: 37
Registriert: Do 23. Feb 2012, 03:41

Re: Binäres Byte-Array in String zum berechnen der MD5/SHA1

Beitrag von chickendev »

mschnell hat geschrieben:Es ist sogar noch einfacher.

Soweit ich mich erinnere ist in der LCL eine Methode zur Berechnung der MD5.

-Michael
Ja, diese Methode verwende ich doch, oder? Für SHA1 verwende ich das DCCrypt Paket wie folgt:

Code: Alles auswählen

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;

gocher
Beiträge: 298
Registriert: Di 23. Nov 2010, 23:41
OS, Lazarus, FPC: Ubuntu/Win, Lazarus trunk, FPC trunk
CPU-Target: 32Bit/64Bit
Wohnort: Geldern
Kontaktdaten:

Re: Binäres Byte-Array in String zum berechnen der MD5/SHA1

Beitrag von gocher »

Also ich würde die folgenden Varianten wählen:

fpc/packages/hash/src/md5.pp

Code: Alles auswählen

function MD5 ( Data : String ) : String;
begin
  result := MD5Print(MD5String(Data));
end;
fpc/packages/hash/src/sha1.pp

Code: Alles auswählen

function SHA1 ( Data : String ) : String;
begin
  result := SHA1Print(SHA1String(Data));
end;
MfG Gocher
akt. Projekt: Webserver(HTTPS HTTP/2) mit integrierten CMS in Free Pascal - www.gocher.me

chickendev
Beiträge: 37
Registriert: Do 23. Feb 2012, 03:41

Re: Binäres Byte-Array in String zum berechnen der MD5/SHA1

Beitrag von chickendev »

OK vielen Dank, ich werde es mal probieren :-)

Antworten