fread()
-
sizeof tut nicht das, was du glaubst.
sizeof bezieht sich auf die Größe von Typen, und zwar zur Compilezeit. szBuffer ist ein char*. Zeiger sind auf 32-Bit-Plattformen 4 Bytes groß. sizeof(szBuffer) ist also vermutlich 4.
Keinesfalls kann sizeof dir zur Laufzeit die Größe eines dynamischen Arrays liefern.
-
Ja, das erscheint soweit logisch.
Allerderings...
http://www.cplusplus.com/reference/clibrary/cstdio/fwrite/Ein Fehler?
MfG
-
Sw1tchy schrieb:
Ein Fehler?
Nö, in dem Beispiel wird sizeof auf ein Array angewendet, das funktioniert natürlich, und die Größe steht ja auch schon zur Compilezeit fest.
-
Okay ich hab nun alles soweit realisiert
Vielen Dank für die nette Hilfe!
MfG
-
Ich bins nochmal...
Inzwischen bereitet mir die binäre Null einige Probleme.
Als Beispiel habe ich ein Char-Array und dieses enthält die Zeichenfolge "\n". Diese wird nun als Steuerzeichen interpretiert.
Gibt es eine Funktion, die Steuerzeichen automatisch entschärft, also aus dem "\n" ein "\\n" macht?MfG
-
Selbern schreiben, wenn es für alles eines passende Faulenzerfunktion geben würde, wäre programmieren doch langweilig. Was du suchst könnte so aussehen:
char buffer1[512], buffer2[2048], a, b, c; int i, j, len; strcpy("Hello Wolrd!\n"); len = strlen(buffer1); memset(&buffer2, 0, sizeof(buffer2)); j = 0; for(i = 0; i < len; i++){ *(buffer2 + j) = '\\'; *(buffer2 + j + 1) = 'x'; c = *(buffer1 + i); a = c & 0xF; if(a < 10){ a += '0'; }else{ a += ('A' - 10); } b = c & 0xF0; b = b >> 4; if(b < 10){ b += '0'; }else{ b += ('A' - 10); } *(buffer2 + j) = '\\'; *(buffer2 + j + 1) = 'x'; *(buffer2 + j + 2) = b; *(buffer2 + j + 3) = a; j += 4; }
Hab das jetzt gearde mal schnell hingeschmiert, möglicherweise ist noch der eine oder ander kleine Fehler drin.
-
Sw1tchy schrieb:
Als Beispiel habe ich ein Char-Array und dieses enthält die Zeichenfolge "\n". Diese wird nun als Steuerzeichen interpretiert.
Das kann ich mir nicht vorstellen. Ich glaube eher, in deinem Array ist tatsächlich ein Zeilenumbruch-Zeichen.
Der ganze Ansatz, Binärdaten in einem Textfeld auszugeben, ist unsinnig. Wenn du das wirklich tun willst, dann ist es mit einer Extrawurst für \n nicht getan. Dann kannst du dir Text-Umschreibungen für insgesamt 32 verschiedene Steuerzeichen ausdenken. Und bedenke bitte, dass du das Ergebnis in der Darstellung dann nicht mehr von Daten unterscheiden kannst, die tatsächlich deine Umschreibungen enthalten.
-
Es geht mir nicht darum, binäre Daten in einem Textfeld auszugeben.
Im Endeffekt schreibe ich gerade eine OTP-basierte Verschlüsselung und diese soll sätmliche Dateien verschlüsseln können.
Nun scheint es mir trotz allem so, dass sich immer wieder ein unerwünschtes Steuerzeichen einschleicht (\0) und die verschlüsselten Daten vorzeitig beendet...Die Idee war ebenfalls nicht, dass ich auf jedes Steuerzeichen einzeln reagieren sondern lediglich einen zweites Backslash in den String einfüge damit dieser "entschärft" wird...
Ich hoffe mein Anliegen ist deutlich geworden, danke schonmal für den Source-Code!
MfG
-
Sw1tchy schrieb:
Nun scheint es mir trotz allem so, dass sich immer wieder ein unerwünschtes Steuerzeichen einschleicht (\0) und die verschlüsselten Daten vorzeitig beendet...
Nullbytes können und dürfen in binären Daten vorkommen, das sollte nicht "unerwünscht" sein.
Ein Problem wird das nur, wenn du die Daten mit Funktionen verarbeitest, die eigentlich für Strings vorgesehen sind. Denn nur dann bewirkt ein Nullbyte ein vorzeitiges Ende.
Sw1tchy schrieb:
Die Idee war ebenfalls nicht, dass ich auf jedes Steuerzeichen einzeln reagieren sondern lediglich einen zweites Backslash in den String einfüge damit dieser "entschärft" wird...
In deinen Daten ist, wie ich oben schon geschrieben habe, vermutlich gar kein Backslash drin, sondern das Steuerzeichen für Zeilenumbruch. Escapesequenzen mit Backslash gibt's nur im Quellcode, nicht in irgendwelchen Daten, die du aus Dateien liest.
Wenn du da einen Backslash hinzufügst, ist das Steuerzeichen immer noch drin, nur eben mit einem Backslash davor. Du könntest (auch wenn das sinnlos ist), das Steuerzeichen durch die Sequenz \n ersetzen, aber dir muss klar sein, dass du diese "Entschärfung" nicht rückgängig machen kannst. Das ist gerade bei Verschlüsselungen nicht so toll.
Wenn dir Nullbytes und andere Steuerzeichen in Binärdaten Probleme bereiten, liegt das daran, dass du sie nicht als Binärdaten behandelst, sondern als Strings.
-
Du hast schon recht. Zuerst lese ich die binären Daten ein und daraufhin behandel ich sie als Strings, da ich sie ja verschlüssel.
Vor der Verschlüsselung ist - wie von dir angesprochen - natürlich keine Escapesequenz mit Backslash vorhanden, danach leider schon.
Bei \n, \r usw. ist das ganze ja kein Problem, doch wenn \0 auftaucht bedeutet dies, dass alles weitere nach dem Steuerzeichen nicht mehr behandelt wird bzw ausgegeben wird.MfG
-
Sw1tchy schrieb:
daraufhin behandel ich sie als Strings, da ich sie ja verschlüssel.
Was hat das eine mit dem anderen zu tun? Verschlüsseln kann man auch Binärdaten. Es gibt da keine Notwendigkeit, mit Strings zu arbeiten.
Sw1tchy schrieb:
Bei \n, \r usw. ist das ganze ja kein Problem, doch wenn \0 auftaucht bedeutet dies, dass alles weitere nach dem Steuerzeichen nicht mehr behandelt wird bzw ausgegeben wird.
Wie "behandelst" du denn? Wie gibst du aus?
Du darfst Binärdaten nicht wie Text behandeln. Weder die unverschlüsselten noch die verschlüsselten Daten. Und das musst du auch nicht.
-
Ich möchte an dieser Stelle einfach mal web kommen von den binären Dateien.
Angenommen ich nehme von dem User einen einfach Text mit Passwort auf. Nun verschlüssel ich den Text und dieser enthält nun womöglich Steuerzeichen.
Beim ausgeben des Textes in einem Textfeld kommt es also dazu, dass nicht der gesamte verschlüsselte Text angezeigt wird - sondern nur ein gewisser Teil.Welche Möglichkeit habe ich nun, den verschlüsselten Text zu "entschärfen"?
Tut mir Leid für die scheinbar unpräzise Fragestellung
-
Sw1tchy schrieb:
Welche Möglichkeit habe ich nun, den verschlüsselten Text zu "entschärfen"?
Benutz eine Verschlüsselung, bei der nur lesbare Zeichen herauskommen. Oder codiere das Ergebnis um, z.B. als Hexdump oder Base64.