Wenn du bei mir um die Ecke wohnen würdest, würde ich dir ein Bier ausgeben.
So dumm wie ich mich anstelle, so dumm bin ich wohl auch
Ist der Rest denn so in Ordnung? Speziell dieses Herumhantier mit +4, -9 und -8?
Hier mein erstes Ergebnis.
Delphi-Quellcode:
iHashLengthInBytes = 64;
aPrefixSuffixLen: Byte = 4;
a: RawByteString = '1234';
b: RawByteString = 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA';
Datei einlesen, Hash bilden und in die Datei an die Stelle von RawByteString speichern
Delphi-Quellcode:
var
aByteStream, aByteStream2: TBytesStream;
iPosRawByte: Int64;
sHash: string;
c: RawByteString;
begin
// This code adds a hash of the original file content to the destination files position of RawByteString
aByteStream := TBytesStream.Create;
try
aByteStream.LoadFromFile(aFileName);
c := a + b + a;
iPosRawByte := Pos(RawByteString(c), RawByteString(aByteStream.Bytes));
if iPosRawByte > 0 then
begin
iPosRawByte := iPosRawByte + Length(a);
aByteStream2 := TBytesStream.Create;
try
aByteStream2.Write(aByteStream.Bytes[0], iPosRawByte - 1);
aByteStream2.Write(aByteStream.Bytes[iPosRawByte + Length(c) - (aPrefixSuffixLen * 2 + 1)], aByteStream.Size - (iPosRawByte + (Length(c) - (aPrefixSuffixLen * 2 + 1))));
sHash := System.Hash.THashSHA2.GetHashString(Trim(TEncoding.ANSI.GetString(aByteStream2.Bytes)));
Move(AnsiString(sHash)[1], aByteStream.Bytes[iPosRawByte - 1], Length(c) - aPrefixSuffixLen * 2);
aByteStream.SaveToFile(aFileName);
finally
aByteStream2.Free;
end;
end;
finally
aByteStream.Free;
end;
end;
Datei einlesen und den Hash des Inhalts (ohne RawByteString) bilden
Delphi-Quellcode:
var
aByteStream: TBytesStream;
iPosRawByte, iPosEx: Int64;
sTmp, sContent: string;
begin
// This code reads the original file content and calculates the hash
aByteStream := TBytesStream.Create;
try
aByteStream.LoadFromFile(aFileName);
iPosRawByte := Pos(RawByteString(a), RawByteString(aByteStream.Bytes));
if iPosRawByte > 0 then
begin
iPosRawByte := iPosRawByte + Length(a);
iPosEx := Pos(RawByteString(a), RawByteString(aByteStream.Bytes), iPosRawByte + 1);
// Hier bin ich auf String umgestiegen, da ich nicht weiß wie man Bytes aus TBytesStream löscht
sTmp := Trim(TEncoding.ANSI.GetString(aByteStream.Bytes));
sContent := Copy(sTmp, 0, iPosRawByte - 1);
sContent := sContent + Copy(sTmp, iPosEx, Length(sTmp));
ShowMessage(sContent);
end;
finally
aByteStream.Free;
end;
end;
Hash auslesen, der an Position des RawByteStrings gespeichert ist
Delphi-Quellcode:
var
aByteStream: TBytesStream;
iPosRawByte: Int64;
begin
// This code reads the hash added at the position of RawByteString
aByteStream := TBytesStream.Create;
try
aByteStream.LoadFromFile(aFileName);
iPosRawByte := Pos(RawByteString(a), RawByteString(aByteStream.Bytes));
if iPosRawByte > 0 then
begin
iPosRawByte := iPosRawByte + Length(a);
aByteStream.Position := iPosRawByte - 1;
aByteStream.Read(aByteStream.Bytes[0], iHashLengthInBytes);
ShowMessage(Trim(TEncoding.ANSI.GetString(aByteStream.Bytes)));
end;
finally
aByteStream.Free;
end;
end;
Denkst du, das ist so "OK"? Ja, das ist viel Copy&Paste aber anders wüsste ich nicht wie es klappen soll.