![]() |
XOR-Resultat als String
Ich habe zwei Schlüssel (Key1 und Key2) mit xor verknüpft:
Delphi-Quellcode:
Der Resultatstring enthält die richtigen Werte aber eben Bit für Bit:
for i := 1 to x do
Result[x] := Chr(Byte(Key1[x]) xor Byte(Key2[x])); Beispiel:
Delphi-Quellcode:
ich möchte aber:
Result = #3#3#2#2#3#A#A#A
Delphi-Quellcode:
Result = '33223AAA'
|
Re: XOR-Resultat als String
du könntest die '#' mit StringReplace entfernen.
Grüße Klaus |
Re: XOR-Resultat als String
Hallo,
kurz und knapp
Delphi-Quellcode:
Stephan
Result := AnsiReplaceText(Result,'#',''); // in StrUtils definiert, ggfls. in Uses aufnehmen.
|
Re: XOR-Resultat als String
Hmm... du willst eine lesbare ausgabe der bytewerte?
Da gibts drei Möglichkeiten: a) Ausgabe als Hex->zwei stellen pro byte ("FF01AB") b) Ausgabe in Dezimal -> drei stellen pro byte ("255255001010011") c) ausgabe im klartext mit delimiter->mind. zwei stellen pro byte (#255#255#1#10#11") Das ganze ist über verschiedene funktionen machbar. @die zwei anderen komiker: loooool..... |
Re: XOR-Resultat als String
@DGL Luke:
wenn man aus: #3#3#2#2#3#A#A#A diese machen will: 33223AAA Dann sind die genannten Methoden sind nicht so verkehrt. Wenn die Ausgabe eine ganz andere sein soll, dann greifen sie natürlich nicht. Grüße einer der Komiker |
Re: XOR-Resultat als String
Hallo alle
Danke erstmal für die prompten Antworten. Falls die Problemstellung nicht überall gleich rüberkam: sorry. Stephan und Klaus haben mich schon richtig verstanden. Es geht mir darum die Hex-Werte lesbar (in diesem Fall ohne $) darzustellen. Dies entspricht dann Lösung a.) von Luke. Ich kann aber $ wohl nicht mit Replace ersetzen, da dieses Zeichen kein Teil vom String darstellt sondern nur die Hex-Repräsentation der nächsten Stelle anzeigt. |
Re: XOR-Resultat als String
@Klaus01 und nahpets:
Ihr habt das System noch nicht verstanden, wie man mit Pascal nicht druckbare Zeichen darstellt. Wenn ich an einen String z.B. ein CarriageReturn + Linefeed anhängen möchte schreibe ich:
Delphi-Quellcode:
Das Rautezeichen ist nur ein Escapezeichen, dass aber im eigentlichen String nicht vorkommt.
s :='Zeile, abgeschlossen mit CR/LF'#13#10;
Deshalb sind alle Ersetzungsaktion sinnlos.
Delphi-Quellcode:
s := #65#66#67; // ist das Gleiche wie 'ABC'
|
Re: XOR-Resultat als String
Zitat:
Delphi-Quellcode:
Ungetestet, Fehlerbehandlung fehlt natürlich auch noch. Ausserdem wird angenommen dass Key1 und Key2 gleich lang sind und den gleichen Indexbereich haben. Hat sicherlich noch Optimierungspotential.
function XorMyKeys(const Key1, Key2: Array of Byte): string;
var i :Integer; begin for i:=Low(Key1) to High(Key1) do begin result:=result+Format('%.2x',[Key1[i] xor Key2[i]]); end; end; Raus kommt ein String der die Hexäquivalente der XOR-Verschluesselung enthält. |
Re: XOR-Resultat als String
Hallo,
mit der Funktion ![]()
Delphi-Quellcode:
Gruß Hawkeye
var
sInput : string; sOutput : string; begin sInput := #3#3#2#2#3#$A#$A#$A; SetLength (sOutput, 2 * Length(sInput)); BinToHex (PChar(sInput), PChar(sOutput), Length(sInput)); end; |
Re: XOR-Resultat als String
Das kommt meinem Wunsch nun doch sehr nahe. Ich bekomme:
Delphi-Quellcode:
Muss ich da manuell nun jedes zweite Zeichen entfernen oder gibt es da auch noch eine elegantere Lösung? Bzw. ich denke ich müsste vor dem xor nicht ein Byte mit einem Zeichen sondern ein Byte mit zwei Zeichen befüllen (bzw. ein Nibble mit einem Zeichen). Geht das?
03030202030A0A0A
|
Re: XOR-Resultat als String
Das kommt ganz auf Deinen Wertebereich an. Jede Hexziffer kann einen von 16 Zuständen anzeigen. Wenn Du nicht mehr als 16 unterschiedliche Zeichen in Deinen Keys hast (oder Werte, oder was auch immer), dann kannst Du das zusammenfassen. Einfach jedes zweite Zeichen "wegmachen" hat mehrere gravierende Nachteile, zum einen musst Du dann annehmen dass der Wertebereich auf jeden Fall maximal von 0 bis 15 geht. Wenn das XOR den Wert 16 ergibt (Hex: $10), würdest du die 1 "wegmachen" und es bleibt nur eine Null übrig.
Auch wenn ich jetzt schon weiss, was Du antworten wirst: Ohne mehr Infos kanns keine richtige Antwort geben. |
Re: XOR-Resultat als String
Das würde auch gehen:
Delphi-Quellcode:
result:='';
for i := 1 to x do result := result+IntToHex( ( (ord(Key1[x]) xor ord(Key2[x]) ),2); Grüße Klaus |
Re: XOR-Resultat als String
Hier nochmal ein Beispiel:
Delphi-Quellcode:
Da ich jetzt aber einzelne Zeichen in jeweils ein Byte konvertiere (Byte(String1[x]), sehen die String binär dargestellt wie folgt aus:
0000 //String1
1111 //String2 xor 1111 //erwartetes Resultat
Delphi-Quellcode:
richtig wäre aber:
00000001 00000001 00000001 00000001 //String1 binär
00000000 00000000 00000000 00000000 //String2 binär xor 00000001 00000001 00000001 00000001 //Resultat binär 01010101 //Resultat als String
Delphi-Quellcode:
00010001 00010001 //String1 binär
00000000 00000000 //String2 binär xor 00010001 00010001 //Resultat binär 1111 //Resultat als String --> korrekt |
Re: XOR-Resultat als String
Hallo,
Du kannst bei IntToHex angeben, wie viele Stellen mindestens verwendet werden. Wenn Du zwei angibst, wird eben mit 0 aufgefüllt. Gruß xaromz |
Re: XOR-Resultat als String
Zitat:
Zitat:
Zitat:
Was Du vermutlich willst, ist ![]() Damit kannst Du dann Deinen String in Schüben von acht Zeichen in DWORDs wandeln und jeweils passend XORen. |
Re: XOR-Resultat als String
Zitat:
Zitat:
Ich hab's bei mir jetzt mal so gelöst:
Delphi-Quellcode:
for i := 1 to x do
Result := Result + IntToHex((StrToInt('$'+ Key1[x]) xor StrToInt('$'+ Key1[x])),1); |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:01 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