.| Autor | Beitrag |
|---|---|
|
000 27.10.2001, 11:45 BoehserOnkel |
Gibt es in C++ nen Befehl der ähnlich funzt wie XOR in Delphi ? Ich will eine ganze Datei verschlüsseln. In Delphi weis ich wie es geht aba in C++ nich... --by BoehserOnkel
|
|
Profil || Suche |
|
001 27.10.2001, 11:56 Kriz |
Der XOR-Operator in C/C++ heißt ^ bzw ^=. Das ist aber ein bitweiser Operator, da es ein logisches XOR in C/C++ nicht gibt. --K:R-I)Z++ |
|
Profil || Suche |
|
002 27.10.2001, 16:12 TheTinySteini |
Aber das ist in seinem Fall (Verschlüsselung) ja ok... TheTinySteini |
|
Profil || Suche |
|
003 27.10.2001, 16:16 Tron |
<krizwiedersprech> 'KEINE PANIK' - aus der Triologie in fuenf Baenden von Douglas Adams 'FÜR DEINN FERD' - aus 'Gevatter Tod' von Terry Pratchett |
|
Profil || Suche |
|
004 27.10.2001, 16:39 BoehserOnkel |
In Delphi sieht das so aus: -- by BoehserOnkel
|
|
Profil || Suche |
|
005 27.10.2001, 18:10 Retro |
Also in Delphi gibts auch noch nen "professionellen" und auf jedenfall cracksichereren Weg als Xor! Guck mal unter den Indy-Misc Komponenten... da sind ne Menge Ver/Entschlüsseler. --shielding people from their own stupidity is an evolutionary step backwards anyway. /* God is dead!............Nietzsche */ |
|
Profil || Suche |
|
006 27.10.2001, 19:40 Prefect |
Naja, für ne Billig"verschlüsselung" (z.B. um Crackern ein paar Minuten zusätzliche Arbeit zu bereiten) reicht XOR allemal. Und Kriz hat ja schon gesagt wie's geht: a = a ^ c; oder: a ^= c; != ist in der Tat ein logisches XOR. Mich würde aber interessieren, ob die C-Standards vorsehen, daß ma Konstrukte wie (a > b) != (b > c) verwendet... cu, Widelands - Gemütliche Aufbaustrategie, Free Software |
|
Profil || Suche |
|
007 27.10.2001, 21:48 Tron |
ich hab mal in der c++ spezifikation nachgelesen <edit>
Prefect, das duerfte dein interesse wohl befriedigen (; </edit> -- 'KEINE PANIK' - aus der Triologie in fuenf Baenden von Douglas Adams 'FÜR DEINN FERD' - aus 'Gevatter Tod' von Terry Pratchett Dieser Beitrag wurde am 27.10.2001 um 21:56 von Tron bearbeitet. |
|
Profil || Suche |
|
008 28.10.2001, 01:10 Kriz |
Da hat Tron recht. Der relationale Operator != (Ungleich) bewirkt beim Vergleich zweier logischer Werte das Verhalten von XOR. Danke Tron, wieder was dazugelernt =) Benutzt man den Vergleichsoperator == (wie in dem Zitat von Tron), dann verhält sich die Abfrage wie ein invertiertes XOR. Doch offiziell gehören != und == nicht zu den logischen Operatoren. Es wäre mal interessant zu wissen, ob Java (das noch strengere Typprüfungen besitzt als C++) sich auch so verhält. Ich teste das mal aus und berichte dann... --K:R-I)Z++ |
|
Profil || Suche |
|
009 28.10.2001, 01:17 Kriz |
Yep, auch Java verhält sich wie C++ und bietet bei != ein logisches XOR und bei == ein invertiertes, logisches XOR an. --K:R-I)Z++ |
|
Profil || Suche |
|
010 28.10.2001, 14:12 Prefect |
Das != ist aber mit Vorsicht zu genießen, da es ein paar tückische Fallen gibt. (a < b) != (flags & 0x40) funktioniert z.B. nicht wie ein logisches XOR, aber (a < b) != (bool)(flags & 0x40) funktioniert... cu, Widelands - Gemütliche Aufbaustrategie, Free Software |
|
Profil || Suche |
|
011 28.10.2001, 14:45 Tron |
@Prefect: meine rede... (:
@Kriz: den "invertierten logischen xor"-operator, also ==, nennt man auch gleichheits-operator - warum wohl? *g* --'KEINE PANIK' - aus der Triologie in fuenf Baenden von Douglas Adams 'FÜR DEINN FERD' - aus 'Gevatter Tod' von Terry Pratchett |
|
Profil || Suche |
|
012 28.10.2001, 19:30 Kriz |
@Tron: Kalauer kalauer =) @Prefect: Ja, da muß man explizit umwandeln, da C++ tatsächlich (flag & 0x40) als Zahl ermittelt und nicht in einen logischen Wert umwandelt. Nur das wieso ist mir rätselhaft, da das Ergebnis von (flag & 0x40) entweder = 0 (false) oder != 0 (true) werden sollte. C reagiert genauso, wobei der Konflikt in C durch das fehlende bool noch erheblicher ist. Java macht dagegen dicht: boolean und int (das ist das Ergebnis von (flag & 0x40)) sind inkompatibel zueinander und können auch nicht durch die strenge Typprüfungen umgangen werden. Also: Es hat schon seinen Grund, wieso es kein offizielles, logisches XOR in C/C++ gibt =) --K:R-I)Z++ |
|
Profil || Suche |
|
013 29.10.2001, 16:19 Prefect |
Das (flags & 0x40) ein int ist hat durchaus Sinn, denn nur dadurch werden Konstruktionen wie: ((flags & (FLAG_A|FLAG_B)) == FLAG_A) möglich... cu, Widelands - Gemütliche Aufbaustrategie, Free Software |
|
Profil || Suche |
|
014 29.10.2001, 16:40 Kriz |
Danach habe ich ja nicht gefragt, Prefi =) Meine Frage war, wieso der int-Wert von (flag & 0x40) in der logischen Abfrage nicht akzeptiert wird und implizit nach bool gewandelt wird. Und die Lösung ist mir heute auch eingefallen: Weil in C++ noch das C drinsteckt und C keinen logischen Datentyp kennt. Also kann dieses if-Konstrukt ohne explizites bool-casting nie funktionieren. Und da man C immer automatisch mitverwendet, ist das logische XOR via == ohne bool-casting shlichtweg unmöglich. --K:R-I)Z++ |
|
Profil || Suche |
|
015 30.10.2001, 12:15 Prefect |
Naja, alles andere wäre ja auch irgendwie dumm, oder? Es ist nunmal so, daß == und != mit _allen_ Datentypen operieren können, und der Compiler vermeidet Casts halt so gut wie möglich weil das a) potentiell Zeit kostet und b) dadurch evtl. Information verloren geht oder verfälscht wird. Selbst wenn C von Anfang an einen Datentyp bool gehabt hätte müßten sich == und != genauso verhalten wie sie es jetzt tun. Ansonsten bräuchte man für jeden Datentyp einen eigenen Operatortyp. cu, Widelands - Gemütliche Aufbaustrategie, Free Software |
|
Profil || Suche |
|
016 30.10.2001, 18:31 Kriz |
Hm, net unbedingt. Wenn auf einer Seite des Operators ein Wert vorliegt und die Abfrage ist rein logischer Natur, dann müßte der Compiler so nett sein, und eben nach der Formel ==0 (false) !=0 (true) einen impliziten, logischen Vorgang starten. Aber ich bin der Meinung, daß das nicht unbedingt immer von Vorteil ist. Mir gefällt Java wegen seinern fast herrischen Typprüfung recht gut, da man da keine "wilde" Scheiße bauen kann, die irgendwo dann für Ungereimtheiten sorgen könnte. --K:R-I)Z++ |
|
Profil || Suche |
|
017 30.10.2001, 19:04 TheTinySteini |
Was heißt hier "wilde Scheiße"? (Editiert wegen Inkompatibilität zum ThWboard Code) --TheTinySteini Dieser Beitrag wurde am 30.10.2001 um 19:06 von TheTinySteini bearbeitet. |
|
Profil || Suche |
|
018 30.10.2001, 20:43 Kriz |
Siehste, selbst Delphi will explizites Casting haben =) Und in deinem Dummycode ist die Sache ja wohl klar: Du übergibst im ersten Beispiel eben einen Integer und kein Char! Sowas muß man eben casten. Und eine Sprache, die das implizit ohne Angabe casten tut, ist in meinen Augen nicht professionell (siehe C64-BASIC z.B.). Datentypen sind nunmal da, um 64+i als Zahl oder char(64+i) als Zeichen zu interpretieren. Eine Möglichkeit wäre natürlich, daß der Compiler so schlau ist, daß er erkennt, daß es sich bei der gewünschten Zuweisung des Elementwerts um ein Zeichen handeln soll, da der Array vom Typ String ist und daher nur Zeichen erwarten kann. Da aber gerade String-Komplexe von Natur aus nicht als Datentyp existieren, sondern wie im Fall von Delphi oder Java oder der MFC als Klassenobjekte, wäre der Aufwand enorm, um den Compiler auf sowas vorzubereiten. Außerdem: Was passiert, wenn man eine eigene Stringklasse entwickelt? Wie will man da dem Compiler dann klarmachen, daß er bei Übergaben ohne explizites casting ein Char erwarten soll? Geht nicht =) Also muß man eben einen kleinsten, gemeinsamen Nenner finden und der heißt eben: Explizites Casting. --K:R-I)Z++ |
|
Profil || Suche |
|
019 31.10.2001, 12:38 TheTinySteini |
Oh, doch, du kannst ja - zumindest in C++ - Zuweisungoperatoren überladen, so dass er auch mit Integer und char* und alles mögliche etwas anfangen kann. Nungut, bei chars mag es noch halbwegs vernünftig sein, einen cast zu erwarten, dann passiert einem nicht so schnell Blödsinn wie Dummy[2] := 68137 - aber auch die der Cast zum Char ändert dann nix daran, dass das Programm einen Fehler hat! Spätestens bei dem if-Beispiel finde ich aber das Verhalten von Delphi doch ziemlich blöde. Besser lesbar isses ohne das Boolean()! Und dass man einfach alles != 0 alles true interpretiert, sollte sich doch mittlerweile rumgesprochen haben. --TheTinySteini |
|
Profil || Suche |
|
020 01.11.2001, 01:08 Kriz |
Zumindest bei C++ hast du recht. Is aber trotzdem blöde Arbeit =) --K:R-I)Z++ |
|
Profil || Suche |

