Hallo Forum, habe mal eine Frage an euch: Ich schaffe es nicht die Steuerzeichen aus den ersten Zeilen der beigefügten Datei 1:1 zu kopieren. Die Datei bearbeite ich (in meiner c# GUI) und speichere diese bearbeitete dann wieder ab. Das klappt soweit auch, bis auf das die Steuerzeichen anscheind nicht mit kopiert werden. Auch wenn ich die original Datei öffne und diese nicht verändere sondern wieder 1 zu 1 im gleichen Format speichere kann meine Slicer Software diese nicht mehr laden.. Woran liegt das?
Naj H. schrieb: > Auch wenn ich die original Datei öffne und diese nicht verändere sondern > wieder 1 zu 1 im gleichen Format speichere kann meine Slicer Software > diese nicht mehr laden.. > Woran liegt das? Du bearbeitest die Datei wahrscheinlich als "Text". Es ist aber kein Text, jedenfalls nicht vollständig. Wenn du sie als Text bearbeiten möchtest, dann musst du erstmal die Steuerzeichen "escapen" und am Ende der Bearbeitung wieder "de-escapen". Escapen bedeutet in erster Näherung: Ersatz durch eine Darstellung, die im Text-Teil nicht vorkommt. Wenn man das nicht garantieren kann, dann muss in zweiter Näherung auch jedes Vorkommen des Excape-Zeichens in den Textdaten seinerseits escaped werden. Hier allerdings, um zu notieren, dass es gerade KEIN Escape-Zeichen ist. So ungefähr funktioniert das.
Jetzt hast Du mich noch mehr verwirrt. Ich soll diese Steuerzeichen "auskommentieren"?
Gleich vorweg: Ich habe absolut keine Ahnung von diesem Dateiformat und orientiere mich nur an der Beispieldatei. Es gibt darin (mindestens) drei Bereiche. "xgcode 1.0" gefolgt von 0xA0 und irgendwas anderem. An Index 20 steht evtl. eine Adresse (0xB0, 0x38, 0x00, 0x00). Wenn es so ist, wäre es wahrscheinlich 14512 (dec), denn genau an diesem Index beginnt der ASCII-Teil der Datei (";generated by ffslicer" ...). Dazwischen befinden sich die Daten, die dir vermutlich Probleme bereiten (abgesehen von ein paar Bytes im Header). Falls das kein kompletter Blödsinn ist, könntest du evtl.: - Den Anfang der Datei (als Binärdaten) einlesen und zumindest grob validieren (also Start mit "xgcode" und Sinnhaftigkeit des Dateiindex des ASCII-Teils). - Alles bis zu diesem Index als Binärdaten einlesen. - Den Rest als Text einlesen und editieren. - Den Binärteil als solchen in eine Datei schreiben. - Den veränderten ASCII-Teil als solchen anhängen. Du müsstest dann nur beachten, dass die Trenner im ASCII-Teil als LF (0x0A) geschrieben werden, nicht als "Windows-Newline" (CR LF, also 0x0D 0x0A), falls dies bei diesem Dateiformat eine Rolle spielt. Ich gehe hier natürlich (naiverweise) davon aus, dass du nur Werte im ASCII-Teil änderst und diese Änderungen keinen Einfluss auf den Binärteil haben.
Hallo Community, habe jetzt echt einiges probiert.. Es werden immer noch einige Zeichen nicht richtig interpretiert bzw. Encoded.. Das ist mein aktueller Code (nur zum testen..)
1 | public sGFormat ParseGXFormat( string sPath ) |
2 | {
|
3 | sGFormat sFile = new sGFormat(); |
4 | |
5 | int iIndex = 0; |
6 | string sGCode = ""; |
7 | sFile.sFormat = "gx"; |
8 | byte[] bFile = new byte[14501]; |
9 | |
10 | |
11 | BinaryReader oBR = new BinaryReader(File.Open(sPath, FileMode.Open), Encoding.GetEncoding("ISO-8859-1")); |
12 | oBR.ReadString(); // Dieser String ist unbrauchbar! Muss aber gelesen werden.. |
13 | |
14 | int iCnt = 0; |
15 | for( iCnt = 0; iCnt < 14501; iCnt++) |
16 | bFile[iCnt] = oBR.ReadByte(); |
17 | |
18 | oBR.Close(); |
19 | |
20 | StreamReader sr = new StreamReader(sPath); |
21 | sLines = new string[CountNewLines(sPath)]; |
22 | |
23 | sGCode = sr.ReadLine(); // xgcode 1.0 |
24 | |
25 | while (sGCode != null) |
26 | {
|
27 | /* Code entfernt..*/
|
28 | sLines[iIndex] = sGCode; |
29 | sGCode = sr.ReadLine(); |
30 | iIndex++; |
31 | }
|
32 | |
33 | sr.Close(); |
34 | |
35 | for(int x = 0 ; x < 14501;x++ ) |
36 | {
|
37 | sLines[1] += bFile[x]; |
38 | }
|
39 | |
40 | return sFile; |
41 | }
|
Hier hat das Dateiformat scheinbar jemand beschrieben: https://github.com/slic3r/Slic3r/issues/4869 Der BinaryReader dürfte für deine Zwecke nicht geeignet sein. Das Ding wird eigentlich eher intern von z.B. BinaryFormatter genutzt und laut Doku gilt bei ReadString() z.B.: "Reads a string from the current stream. The string is prefixed with the length, encoded as an integer seven bits at a time." ...das ist bei diesem *.gx-Format aber nicht der Fall (bzw. wahrscheinlich generell bei praktisch nichts, was nicht zufällig auch via BinaryWriter/BinaryFormatter erzeugt wurde ;D) Verwende besser direkt nur FileStream.Read() / .ReadByte() und lies dir damit relevante* String-Sektionen z.B. jeweils in eigene byte[]-Arrays und konvertiere dir das dann z.B. via string result=Encoding.GetEncoding("ISO-8859-1").GetString(quellByteArray); jeweils in einen String. (*vermutlich nur der Teil wo der tatsächliche gcode los geht? Und davor wird nichts editiert?)
Naj H. schrieb: > habe jetzt echt einiges probiert.. > Es werden immer noch einige Zeichen nicht richtig interpretiert bzw. Ich meinte es wie im Anhang - einfach die Binärteile (Header und Bitmap; danke an bluppdidupp für den Link) speichern und danach den Textteil (G-Code) drankleben. Das Beispielprogramm lädt die Datei, hängt an die erste G-Code-Zeile etwas an und speichert das Ganze wieder (Vorsicht, sollte die Zieldatei existieren, wird sie überschrieben). gxsav in.gx out.gx Falls Du mit dem Bitmap nichts machen willst - z.B. anzeigen oder speichern -, werden GxBitmap.cs (und damit System.Drawing) und die gekennzeichneten Zeilen in GxFile nicht benötigt.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.