![]() |
Universale ToHex und FromHex procedure/function
Hi @ll,
ich habe diese Funktionen geschrieben um ein set of xy abzuspeichern, aber eigentlich müssten diese Funktionen mit jedem "normalen" Datentyp funktionieren:+
Delphi-Quellcode:
Anwendungsbeispiel:
function ToHex(data: PChar; bytes: integer):string;
var i: integer; res: string; begin setlength(res, bytes*2); res :=''; for i:=1 to bytes do begin res :=res+IntToHex(byte(data^),2); inc(data); end; result :=res; end; procedure FromHex(data: PChar; hex: string); var i: integer; begin for i:=0 to length(hex) div 2-2 do begin if i>=1 then inc(data); data^ :=char(StrToInt('$'+hex[i*2+1]+hex[i*2+2])); end; end;
Delphi-Quellcode:
Natürlich solltet iohr gewarnt sein, dass man sich mit diesen zwei Funktionen auch was kaputt machen kann, wenn beispielsweise byte inkorrekt übergeben wurde oder man versucht mit FromHex In eine Variable zu schreiben, die zu klein ist um die Daten aufzunehmen.
procedure Beispiel;
var str: string; aSet; set of byte; begin aSet :=[1,2,3,109,250]; str :=ToHex(@aSet,sizeof(aSet)); //Jetzt kann man str gemütlich in einer Datei speichern und später wieder laden: FromHex(@aSet,str); end; Ausserdem könnt ihr die Funktion natürlich nur auf Variabeln anweden, die hintereinander weg im ram sind. Das auf ein Objekt anzuwenden könnte lustige Effekte haben. Ausserdem bewart euch diese Funktion auch nicht vor Inkompatibilitäten zwsischen Systemen. Ein integer auf einem 64bit-System hat... naja... eben 64 bit und auf einem 32 bitsystem nur 32. Beim Speichern von einem Integer auf 64 bit und laden auf 32 bit kann also auch lustige Effekte haben. Umgekehr natürlich genauso, nur dass ihr umgekehrt wahrscheinlich deutlich länger brauchen werdet, bis ihr den Bug gefunden habt. Aber wenn ihr wisst, was ihr tut, könnten diese zwei Funktionen durchaus nützlich sein :-). |
Re: Universale ToHex und FromHex procedure/function
Bist du dir sicher, dass das funktioniert?
Erstmal sinnloses Streichen:
Delphi-Quellcode:
Eins von beiden ist sinnlos. (die erste Variante ist für die Perfomance der restlichen Funktion besser, allerdings müsste man dann den Rest auch ändern)
setlength(res, bytes*2);
res :=''; //ist nix anders als setlength(res,0);
Delphi-Quellcode:
Das if kann raus, die Schleife wird eh beendet und dem Zeiger ist es egal wohin er zeigt.
if i<bytes then inc(data);
Was ich aber überhaupt nicht verstehe ist das hier:
Delphi-Quellcode:
Du weist schon, wie ein set abgespeichert wird? in deinem Fall ist es 32 Byte lang und jedes Bit entspricht einem Wert. Und dieses Bit ist eben gesetzt oder nicht gesetzt.
IntToHex(byte(data^),2)
Deswegen verstehe ich nicht, was du vor hast. Abgesehen davon, dass du mit deinem data-Zeiger viel zu weit rennst. |
Re: Universale ToHex und FromHex procedure/function
|
Re: Universale ToHex und FromHex procedure/function
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
Ich bin ja für Kritik und änderungsvorschläge durchaus aufgeschlossen, aber der Satz sagt nur "irgendwie verstehe ich das alles nicht und daher... daher ist das falsch" :-). Zitat:
Nur haben dir mir immer einfach irgendwelche Exceptiosn geworfen, die ich nicht nachvollziehen konnte. |
Re: Universale ToHex und FromHex procedure/function
Zitat:
Delphi-Quellcode:
Gruß Hawkeye
function Bin2Hex (const Data; Size: Cardinal): string;
begin SetLength (Result, 2 * Size); BinToHex (@Data, PChar(Result), Size); end; procedure Hex2Bin (const s: string; var Data); begin HexToBin(PChar(LowerCase(s)), @Data, Length(s) div 2); end; |
Re: Universale ToHex und FromHex procedure/function
Zitat:
Jetzt frag ich mich ja schon, was ich eben falsch gemacht habe, aber ich würde sagen, damit kann man das Thema voll getrost vergesse ;-). |
Re: Universale ToHex und FromHex procedure/function
Ich bin in der Annahme, dass nach der Funktion ToHex bei deinem Beispiel am Ende folgender String stehen soll: "0102036DFA". Den Nutzen habe ich dann auch noch nicht verstanden, aber egal. vielleicht übersehe ich da noch etwas. Auf jeden Fall kommt das Ergebnis bei dir nicht heraus, sondern (jetzt hab ichs mal getestet): "0E00000000000000000000000020000000000000000000000 000000000000004"
Dein Data rennt nicht zu weit, denn sizeof gibt nicht 256 zurück (wie ich dachte) sondern tatsächlich 32 Bytes. Was du also machst, ist ein set in einer Form zurückzugeben, die entweder nicht dem entspricht, was du wolltest, oder ich verstehe den Sinn nicht. Das zurücksetzen klappt. Allerdings, kannst du hier auch das if sparen, wenn du das inc hinter die andere Anweisung setzt. |
Re: Universale ToHex und FromHex procedure/function
Zitat:
Zitat:
Kannst du mir mal sagen, wie man auf was anderes kommen soll?? Zitat:
Zitat:
Zitat:
Zitat:
|
Re: Universale ToHex und FromHex procedure/function
Zitat:
Zitat:
Zitat:
Delphi-Quellcode:
:gruebel:
function SetToString(data: PChar; bytes: integer):string;
var i: integer; begin setlength(result, bytes); for i:=1 to bytes do begin result[i]:=data^; inc(data); end; end; oder einfach so:
Delphi-Quellcode:
function SetToString(const data; bytes: integer):string;
begin setlength(result, bytes); move(data,result[1],bytes); end; |
Re: Universale ToHex und FromHex procedure/function
Hallo sirius,
Zitat:
Gruß Hawkeye |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:44 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz