Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
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
visit http://www.upg.de.tf
----------------------------------------
Du hast doofe Ohren !
(Der kleine junge Mann von neben an)

zum Seitenanfang zum Seitenende 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++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)

zum Seitenanfang zum Seitenende Profil || Suche
002
27.10.2001, 16:12
TheTinySteini



Aber das ist in seinem Fall (Verschlüsselung) ja ok...
Aber: Seit wann kann man bei xor von Verschlüsselung speichern? ;-)

--

TheTinySteini
Coder Poke646
"Don't Panic" - Hitchhiker's Guide to the Galaxy

zum Seitenanfang zum Seitenende Profil || Suche
003
27.10.2001, 16:16
Tron



<krizwiedersprech>
es gibt auch ein logisches xor in c(++)
!=
allerdings muss man dann genau eine darstellung fuer je wahr und falsch haben, also 0 und 1, und nicht 0 ist falsch und alles andere ist wahr.
</krizwiedersprech>

--

'KEINE PANIK' - aus der Triologie in fuenf Baenden von Douglas Adams

'FÜR DEINN FERD' - aus 'Gevatter Tod' von Terry Pratchett

zum Seitenanfang zum Seitenende Profil || Suche
004
27.10.2001, 16:39
BoehserOnkel



In Delphi sieht das so aus:
mem := Tmemorystream.Create;
mem.LoadFromFile(opendialog1.filename);
for I := 1 to mem.Size do
begin
z := strtoint(edit2.text); //code der vom nutzer eingegeben wird
a:= strtoint(edit2.text); // ''
mem.position := I;
mem.Read(a,1);
a:= a xor z;
mem.position := I;
mem.write(a,1);
mem.SaveToFile(opendialog.FileName + '.new');
end;
end;

--
Aber wie geht das denn jetz in C++

--

by BoehserOnkel
visit http://www.upg.de.tf
----------------------------------------
Du hast doofe Ohren !
(Der kleine junge Mann von neben an)

zum Seitenanfang zum Seitenende 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 */
/* Nietzsche is dead!......God */
/* Nietzsche is God!.......The Dead */

zum Seitenanfang zum Seitenende 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,
Prefect

--

Widelands - Gemütliche Aufbaustrategie, Free Software
Noch ein Blog - Lerne, wie die Welt wirklich ist, aber vergiss niemals, wie sie sein sollte.

zum Seitenanfang zum Seitenende Profil || Suche
007
27.10.2001, 21:48
Tron



Zitat:
Prefect postete
!= 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...

ich hab mal in der c++ spezifikation nachgelesen
dort steht dass alle relationalen operatoren (also <, >, ==, != etc.) 1 zurueckgeben, wenn der ausdruck wahr ist, wenn er falsch ist wird 0 zurueckgegeben
also muesste != als logisches xor funktionieren (zumindest in faellen wie deinem beispiel, also in denen != ergebnisse von vorangehenden relationalen operationen vergleicht)

<edit>
hab nochmal etwas weiter gelesen und habe eine interessante anmerkung gefunden:

Zitat:
Note: a<b == c<d is true whenever a<b and c<d have the same truth­value.

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.
zum Seitenanfang zum Seitenende 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++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)

zum Seitenanfang zum Seitenende 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++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)

zum Seitenanfang zum Seitenende 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,
Prefect

--

Widelands - Gemütliche Aufbaustrategie, Free Software
Noch ein Blog - Lerne, wie die Welt wirklich ist, aber vergiss niemals, wie sie sein sollte.

zum Seitenanfang zum Seitenende Profil || Suche
011
28.10.2001, 14:45
Tron



Zitat:
Prefect postete
Das != ist aber mit Vorsicht zu genießen, da es ein paar tückische Fallen gibt.

[i](a < b) != (flags & 0x40) funktioniert z.B. nicht wie ein logisches XOR, aber (a < b) != (bool)(flags & 0x40) funktioniert...

cu,
Prefect[/i]

@Prefect: meine rede... (:

Zitat:
Tron postete
(zumindest in faellen wie deinem beispiel, also in denen != ergebnisse von vorangehenden relationalen operationen vergleicht)

@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

zum Seitenanfang zum Seitenende 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++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)

zum Seitenanfang zum Seitenende 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,
Prefect

--

Widelands - Gemütliche Aufbaustrategie, Free Software
Noch ein Blog - Lerne, wie die Welt wirklich ist, aber vergiss niemals, wie sie sein sollte.

zum Seitenanfang zum Seitenende 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++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)

zum Seitenanfang zum Seitenende 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,
Prefect

--

Widelands - Gemütliche Aufbaustrategie, Free Software
Noch ein Blog - Lerne, wie die Welt wirklich ist, aber vergiss niemals, wie sie sein sollte.

zum Seitenanfang zum Seitenende 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++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)

zum Seitenanfang zum Seitenende Profil || Suche
017
30.10.2001, 19:04
TheTinySteini



Was heißt hier "wilde Scheiße"?
Ich find das zum Beispiel bei Delphi ziemlich blöde, dass man z.B. nicht folgendes machen kann:
Quellcode:
var Dummy: String[20];
i: Integer;
begin
for i := 1 to 19 do
Dummy[ i ] := 64 + i;

Dummy[20] := 0;
end;

Delphi besteht auf:
Quellcode:
[...]
Dummy[ i ] := char(64 + i);

Dummy[20] := char(0);
end;

... also sowas finde ich dann doch übertrieben.
Und seltsamerweise geht bei Delphi auch sowas nicht:
Quellcode:
if( iFlags and 0x00000004 ) then DoSomething();

Es wird nämlich hierauf bestanden:
Quellcode:
if( Boolean(iFlags and 0x00000004) ) then DoSomething();

Bah!

(Editiert wegen Inkompatibilität zum ThWboard Code)

--

TheTinySteini
Coder Poke646
"Don't Panic" - Hitchhiker's Guide to the Galaxy


Dieser Beitrag wurde am 30.10.2001 um 19:06 von TheTinySteini bearbeitet.
zum Seitenanfang zum Seitenende 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++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)

zum Seitenanfang zum Seitenende Profil || Suche
019
31.10.2001, 12:38
TheTinySteini



Zitat:

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 =)

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
Coder Poke646
"Don't Panic" - Hitchhiker's Guide to the Galaxy

zum Seitenanfang zum Seitenende 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++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)

zum Seitenanfang zum Seitenende Profil || Suche