Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
chickendev
Beiträge: 37 Registriert: Do 23. Feb 2012, 03:41
Beitrag
von chickendev » So 19. Aug 2012, 15:51
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 ;
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:
Beitrag
von Socke » So 19. Aug 2012, 16:19
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
Beitrag
von chickendev » So 19. Aug 2012, 16:22
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:
Beitrag
von Socke » So 19. Aug 2012, 18:08
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
Beitrag
von mschnell » So 19. Aug 2012, 22:47
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
Beitrag
von chickendev » So 19. Aug 2012, 22:56
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 ;
var
Hash: TDCP_sha1;
Digest: array [0 ..19 ] of byte;
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:
Beitrag
von gocher » Mi 22. Aug 2012, 02:54
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
Beitrag
von chickendev » Mi 22. Aug 2012, 06:33
OK vielen Dank, ich werde es mal probieren