Wie kann ich diese XOR-Verschlüsselungsfunktion von Delphi in C # konvertieren?

8

Die folgende Delphi-Routine stammt ursprünglich aus einer CompuServe-Veröffentlichung vor langer Zeit und wird zum Verschlüsseln verschiedener Informationen in unserer Datenbank verwendet. Im Folgenden sind sowohl Delphi 2007 als auch (dank einiger SO-Hilfe mit den Unicode-Unterschieden) Delphi XE-Versionen.

Wir haben versucht, dies in C # umzuwandeln, und sind nah dran, aber irgendwo fehlt etwas. Leider kennt unser Delphi-Typ (ich) C # nicht, und der C # -Typ ist neu in Delphi. C # scheint nicht das Konzept von AnsiString zu haben, also wird die Lösung wahrscheinlich Byte- oder Zeichenfelder beinhalten?

Wir freuen uns über jede Hilfe bei der Konvertierung in C #.

Delphi 2007 Version (ASCII)

%Vor%

Delphi XE-Version (Unicode)

%Vor%     
Eric S. 20.07.2011, 19:59
quelle

2 Antworten

11

Ich kenne auch C # nicht, also ist das wahrscheinlich ernsthaft nicht idiomatisch.

%Vor%

Ich habe angenommen, dass Ihre ANSI-Strings mit Windows 1252 codiert sind, aber wenn Sie Ihre alten Daten mit einer anderen Codepage codiert haben, ist es offensichtlich, wie Sie sie ändern können.

Da C # nicht das Äquivalent von Delphi's 8-Bit String Typen hat, wäre ich persönlich sehr versucht, byte[] anstatt string zu benutzen.

So sieht es aus:

%Vor%

@Groo macht den ausgezeichneten Punkt, dass der Hash sauberer initialisiert werden kann, listet dies auf:

%Vor%     
David Heffernan 20.07.2011, 20:32
quelle
2

String in C # ist eine Folge von Zeichen, die in UTF-16 codiert sind, wie in diesem Artikel von Jon erklärt Skeet . Das sollte Sie überhaupt nicht betreffen, bis Sie sich entscheiden, es binär zu serialisieren (d. H. Es in ein Byte-Array umzuwandeln). In diesem Fall gibt es eine Klasse namens Encoding in System.Text namespace, die die Codierung unterstützt die String zu der von Ihnen gewünschten Kodierung.

Ein AnsiString in Delphi ist im Grunde eine ASCII-Zeichenkette (nein, es ist wirklich eine ANSI-Zeichenkette, wie der Name sagt), wobei jedes Zeichen garantiert genau 8 Bits hat. Dies ist eine relativ "einfache" Kodierung der Kodierung, da sie eine feste Größe hat, weitgehend akzeptiert und mit Legacy-Systemen kompatibel ist (sie erlaubt jedoch nicht die Kodierung von mehr als 255 Zeichen).

Mit anderen Worten, beide Versionen behandeln den gleichen Encoding-Typ, aber die Unicode-Version definiert nun Legacy-Strings explizit als AnsiString s. Das bedeutet, dass die letzte Version keine Unicode-Zeichenfolgen unterstützt, aber der Typ muss mit der neuen Delphi-Version geändert werden.

Was @David getan hat, während ich diesen langwierigen Unsinn geschrieben habe, ist im Grunde das, was ich schreiben würde, mit der Ausnahme, dass ich das Encoding.ASCII Kodierung statt ( [edit]) und würde kläglich scheitern aufgrund der Tatsache, dass ASCII nur die unteren 7-Bits verwendet, um Zeichen zu kodieren , wie von David unten erwähnt ). Windows-1252 ist die Codierung, die am häufigsten als "ANSI" bezeichnet wird (obwohl, wenn Sie diesen Wiki-Artikel überprüfen, Sie werden herausfinden, dass es laut Microsoft Der Begriff ANSI, wie er für Windows-Codepages verwendet wird, ist eine historische Referenz, ist aber heutzutage eine falsche Bezeichnung, die in der Windows-Gemeinschaft weiterhin besteht ).

    
Groo 20.07.2011 20:42
quelle

Tags und Links