Read/Write in C#
-
Hi,
Ich habe mit C++ immer die Dateien so geschrieben:
void write(std::string path, char*data, int size) { FILE*f; fopen_s(&f,path.c_str(),"wb"); if(f!=NULL) { fwrite(data,size,1,f); fclose(f); } }
Gelesen dann äuqivalent.
Gibt es eine .NET Funktion dafür ?
Ich habe es mit StreamWriter probiert, aber da muss ich ja "Encoding" angeben, und egal was ich versucht habe, es hat nicht geklappt...Ich habe noch Dateien, die so mit C++ eingelesen, und dann mehrere in einer Datei so gespeichert wurden.
Diese versuche ich jetzt durch C# einzulesen. Aber da es ".jpg" sind, also Sonderzeichen, können die Bilder nicht korrekt entnommen werden.
Wie kann ich das machen ?
-
Versuchs mal mit dem BinaryWriter, StreamWriter ist bloß für Text geeignet.
-
Danke, es geht endlich
Ich habs jetzt mit "Encoding.Default".
Geht das dann auf anderen Rechnern auch oder wie ist das ?Noch was:
Stream s=File.Open("c:/2/xxxx.jpg",FileMode.Create); BinaryWriter bw = new BinaryWriter(s,Encoding.Default); for(int i=0;i<data.Length;i++) { bw.Write(data[i]); } s.Close();
geht
Stream s=File.Open("c:/2/xxxx.jpg",FileMode.Create); BinaryWriter bw = new BinaryWriter(s,Encoding.Default); bw.Write(data); s.Close();
geht nicht, die Größe ist 2 Byte größer
Woran liegt das ?
-
Ich nehme mal an 'data' ist ein byte[] ?
Dann scheint es so zu sein, daß Write(byte[]) zuerst die Länge dieses Arrays in den Stream schreibt (und daher ist es dann um einige Bytes größer).
(Edit: Falsche Annahme - mea culpa, s. u.)P.S. Das Encoding ist nur wichtig, falls du char, char[] bzw. string in den Stream schreibst.
Und noch ein P.S:
Du kannst es dir auch noch einfacher machen und File.ReadAllBytes bzw. File.WriteAllBytes verwenden -)
-
DarkShadow44 schrieb:
Ich habs jetzt mit "Encoding.Default".
Hände weg von $IRGENDWAS.Default ... das kann in die Hose gehen ... Default nutzt immer irgend welche Systemeinstellungen ... die können auf einem anderen Rechner wieder anders sein ... dann funktioniert Dein Programmnicht so wie erwartet ... leg es lieber explizit fest - also auf UTF-8 / UTF-32 / ASC
-
Th69 schrieb:
Ich nehme mal an 'data' ist ein byte[] ?
Dann scheint es so zu sein, daß Write(byte[]) zuerst die Länge dieses Arrays in den Stream schreibt (und daher ist es dann um einige Bytes größer).Völliger Unsinn.
Ich habe es sicherheitshalber nochmals nachgeprüft, es werden nur die Bytes reingeschrieben und sonst nichts.mogel schrieb:
Hände weg von $IRGENDWAS.Default ... das kann in die Hose gehen ... Default nutzt immer irgend welche Systemeinstellungen ... die können auf einem anderen Rechner wieder anders sein ... dann funktioniert Dein Programmnicht so wie erwartet ... leg es lieber explizit fest - also auf UTF-8 / UTF-32 / ASC
Also "Hände weg" ist ja wohl etwas übertrieben. Aufpassen sollte man damit allerdings schon, es kann aber auch durchaus erwünscht sein, dass man die Default-Einstellung bekommt.
Encoding.Default
liefert hier einfach die System-Codepage zurück.@DarkShadow44,
1. BinaryWriter hat einen Konstruktor ohne Encoding Parameter, also falls du sowas nicht brauchst
2. Wenn du nur Bytes schreiben möchtest, gibt es von Stream selber eineWrite
Methode.
3. Siehe Th69s Antwort mit demReadAllBytes
undWriteAllBytes
.
4. Dein C++ Code benutzt C Code, dabei hat man in C++ extra File-Streams.void write(std::string path, char const* data, int size) { std::ofstream out(path.c_str(), std::ios::binary); if(!out.write(data, size)) { // Fehler. } }
5. Kannst du bitte ein kurzer Code liefern, mit welchem man das beschriebene Verhalten mit den zwei zusätzlichen Bytes reproduzieren kann? Er muss also auch funktionsfähig sein. Denn ich glaube, dass der Fehler irgendwo anders liegt und nicht bei
BinaryWriter
.
Hast du zum Beispiel schon mal überprüft, wieviele Bytes indata
sind?Grüssli
-
Hallo DarkShadow44 und Dravere,
sorry, habe mich mit 'string' vertan - dort ist es so, daß immer zuerst die Länge reingeschrieben wird (konnte mir aber nicht vorstellen, daß jemand wirklich einen String für Binärdaten benutzt...)
-
Es ist so, dass ich eine eigene Verschlüsselung habe:
public static string encrypt(string data, string pass) { int i; int len = data.Length; StringBuilder data2 = new StringBuilder(); for (i = 0; i < len; i++) { char c1 = data[i]; char c2 = pass[p]; int i1 = (int)c1; int i2 = (int)c2; if(/*...*/) { i1+=i2; } else { i1-=i2; } while (i1 < 0) //anpassen { i1 += 256; } while (i1 > 255) //anpassen { i1 -= 256; } char cc=(char)i1; }
So aus C++ direkt übernommen.
Dabei kommen natürlich auch Sonderzeichen raus...
Aber welche maximalen/minimalen Werte für chars gelten in C# ?
In C++ war unsigned char zwischen 0 und 255, aber in C#...
Die Schleifen "normieren" die Werte, dass sie nicht unter Minimum oder über Maximum liegen...Und diese Werte müssen dann in einer Datei gespeichert werden. Und geladen.
Welches Encoding soll ich da nutzen ?
-
Google mal nach "Base64"
-
Hallo DarkShadow44,
benutze als Gegenstück zum C++ 'unsigned char' in C# den Datentyp 'byte' (ein char ist in .NET intern 2 Bytes groß).
Und statt dem StringBuilder dann ein byte-Array (also byte[])!Dies wollte ich eigentlich mit meinen bisherigen Antworten dir als Hinweis geben (aber du scheinst es ja nicht verstanden zu haben
)
Schau dir auch mal folgende Vergleichstabelle an: http://de.wikibooks.org/wiki/Arbeiten_mit_.NET:_Grundlagen:_C-Sharp/%C3%9Cberblick%C3%BCber_Datentypen
-
Hi,
Danke an alle.Ich verwende jetzt die Base64 Konvertierung (und Read/WriteallBytes) für die Bilder, das spart sogar massig Speicher
Zum Glück unterstützt C++/CLI auch .Net Code ...
Die Verschlüsselung habe ich jetzt so beibehalten, gespeichert in Unicode.
Bisher geht's also, auch die gespeicherten Dateien konnte ich importieren. Nur C++ kann sie jetzt nicht mehr lesen