Jeg sad lige og så SuperBall og mente så at det ville være passende at overflade et eller andet tilfældigt spørgsmål fra eksperten i min indbakke. Det her blev så offeret....
På dette link ligger koden til et lille demo program:
http://home1.inet.tele.dk/nip/temp/HexFileStream.zipKort fortalt, så går det ud på at jeg sub-classer, dvs laver/nedarver en ny class fra en anden eksisterende class, TFileStream. Dette gør jeg ved at oprette følgende class:
type
THexFileStream = class(TFileStream)
public
{ Public declarations }
Function ReadAsHexStr(Var Buf: String; Count : Longint): Longint;
Function WriteAsHexStr(Buf : String): Longint;
end;
Som det ses laver jeg to nye public metoder, der kan henholdsvis læse og skrive en streng, på hexformat, til og fra en FileStream - dvs. en hvilken som helst disk fil.
De to metoder er implementeret som:
function THexFileStream.ReadAsHexStr(var Buf: String; Count: Integer): Longint;
Var
ByteArr : PByteArray;
t : LongInt;
begin
Buf := '';
GetMem(ByteArr, Count);
Try
Result := Read(ByteArr^, Count); // TFileStream.Read()
For t := 0 To Result-1 Do
Buf := Buf + IntToHex(ByteArr[t], 2);
Finally
FreeMem(ByteArr);
End
end;
function THexFileStream.WriteAsHexStr(Buf : String): Longint;
Var
ByteArr : PByteArray;
t : LongInt;
begin
t := 0;
GetMem(ByteArr, (Length(Buf) Div 2)+1);
Try
While Length(Buf)>0 Do
Begin
ByteArr[t] := StrToInt('$' + Copy(Buf, 1, 2));
Delete(Buf, 1, 2);
Inc(t);
End;
Write(ByteArr^, t); // TFileStream.Write()
Finally
FreeMem(ByteArr);
End;
end;
Bemærk, at jeg forventer at en hex-streng består ren hex-cifre og at jeg ikke gør noget specielt for at formatere hexstrengene. Hermed mener jeg, at jeg ikke tager højde for, at strengene kan indeholde mellemrum, '$'-tegn eller '0x'-tegn.
Dvs: en hexstreng, der skal symbolisere strengen 'ABC', skal altså indeholde '414243'.
Det er en smal sag, at fjerne alle uønskede tegn, fx. fjernes mellemrum med linien:
While Pos(' ', Buf)<>0 Do Delete(Buf, Pos(' ', Buf), 1);
Zip-filen, der hentes via ovenstående link, indeholder source til en primitiv hex-editor, der, med en form indeholdede et memofelt og andre visuelle controls, viser hvoledes man kan bruge stream classen.
Med venlig hilsen
Peter
- og nu går jeg i seng!