GBA Pokemon Hex Datei bearbeiten
-
Also ich wollte einen Text Changer für Pokemon Rubien/Saphier und Smaragt schreiben (in C++ auf dem Mac). Habe bisher mit http://magicstone.de/rhw/files/andere/Rubylat.tbl dieser Tabelle ein programm geschrieben, das das komplette GBA Rom "entschlüsselt" und als .txt speichert, man kann also den gesammten Spiel-Text darin nachlesen.
So nachdem man dort dann den Text nach seinen Wünschen geändert hat, würde ich gerne den Inhalt der Textdatei wieder in eine binärdatei als .gba schreiben, dazu muss natürlich alles wie in der Tabelle beschrieben wieder in Hex umgewandelt werden. Und genau an dieser Stelle bleibe ich seit laaangem hängen. Ich hab überall gesucht und nichts hat funktioniert, desshalb poste ich jetzt hier einfach den kompletten Code (Ja es tut mir leid aber ich weis mir nicht mehr zu helfen). Ich hoffe ihr wisst was genau ich falsch mache oder woran es liegt.
#include <iostream> #include <fstream> #include <sstream> #include <iomanip> int main (int argc, const char * argv[]) { using namespace std; system("clear"); string PathDE; string PathGBA; string Zeichen; fstream schreiben; ifstream lesen; unsigned char q; unsigned char a; int kontrolle = 0; int current = 0; stringstream converter; char buffer1[3] = "00"; char buffer2[3] = "a1"; char buffer3[3] = "a2"; char buffer4[3] = "a3"; char buffer5[3] = "a4"; char buffer6[3] = "a5"; char buffer7[3] = "a6"; char buffer8[3] = "a7"; char buffer9[3] = "a8"; char buffer10[3] = "a9"; char buffer11[3] = "aa"; char buffer12[3] = "ab"; char buffer13[3] = "ac"; char buffer14[3] = "ad"; char buffer15[3] = "af"; char buffer16[3] = "ae"; char buffer17[3] = "b1"; char buffer18[3] = "b8"; char buffer19[3] = "b9"; char buffer20[3] = "ba"; char buffer21[3] = "bb"; char buffer22[3] = "bc"; char buffer23[3] = "bd"; char buffer24[3] = "be"; char buffer25[3] = "bf"; char buffer26[3] = "c0"; char buffer27[3] = "c1"; char buffer28[3] = "c2"; char buffer29[3] = "c3"; char buffer30[3] = "c4"; char buffer31[3] = "c5"; char buffer32[3] = "c6"; char buffer33[3] = "c7"; char buffer34[3] = "c8"; char buffer35[3] = "c9"; char buffer36[3] = "ca"; char buffer37[3] = "cb"; char buffer38[3] = "cc"; char buffer39[3] = "cd"; char buffer40[3] = "ce"; char buffer41[3] = "cf"; char buffer42[3] = "d0"; char buffer43[3] = "d1"; char buffer44[3] = "d2"; char buffer45[3] = "d3"; char buffer46[3] = "d4"; char buffer47[3] = "d5"; char buffer48[3] = "d6"; char buffer49[3] = "d7"; char buffer50[3] = "d8"; char buffer51[3] = "d9"; char buffer52[3] = "da"; char buffer53[3] = "db"; char buffer54[3] = "dc"; char buffer55[3] = "dd"; char buffer56[3] = "de"; char buffer57[3] = "df"; char buffer58[3] = "e0"; char buffer59[3] = "e1"; char buffer60[3] = "e2"; char buffer61[3] = "e3"; char buffer62[3] = "e4"; char buffer63[3] = "e5"; char buffer64[3] = "e6"; char buffer65[3] = "e7"; char buffer66[3] = "e8"; char buffer67[3] = "e9"; char buffer68[3] = "ea"; char buffer69[3] = "eb"; char buffer70[3] = "ec"; char buffer71[3] = "ed"; char buffer72[3] = "ee"; char buffer73[3] = "f1"; char buffer74[3] = "f2"; char buffer75[3] = "f3"; char buffer76[3] = "f4"; char buffer77[3] = "f5"; char buffer78[3] = "f6"; char buffer79[3] = "fe"; //-------------------------------------------- cout << "[i] Pokemon Text Encoder for Rubin Saphir Smaragt" << endl; cout << endl << "[?] Path To Decoded Text: "; if(!(cin >> PathDE)){ return 1; } cout << endl << "[?] Path where to save Encoded GBA: "; if(!(cin >> PathGBA)){ return 1; } { cout << "[i] Working... Please wait." << endl; } lesen.open(PathDE.c_str(), ios::in); schreiben.open(PathGBA.c_str(), ios::out | ios::binary); while(lesen.read(reinterpret_cast<char*>(&q), 1)){ kontrolle++; } lesen.close(); lesen.open(PathDE.c_str(), ios::in); while(current <= kontrolle){ lesen.read(reinterpret_cast<char*>(&a), 1); converter << a; converter >> Zeichen; if(Zeichen == "_"){ schreiben.write(buffer1,3); } else if(Zeichen == "0"){ schreiben.write(buffer2,3); } else if(Zeichen == "1"){ schreiben.write(buffer3,3); } else if(Zeichen == "2"){ schreiben.write(buffer4,3); } else if(Zeichen == "3"){ schreiben.write(buffer5,3); } else if(Zeichen == "4"){ schreiben.write(buffer6,3); } else if(Zeichen == "5"){ schreiben.write(buffer7,3); } else if(Zeichen == "6"){ schreiben.write(buffer8,3); } else if(Zeichen == "7"){ schreiben.write(buffer9,3); } else if(Zeichen == "8"){ schreiben.write(buffer10,3); } else if(Zeichen == "9"){ schreiben.write(buffer11,3); } else if(Zeichen == "!"){ schreiben.write(buffer12,3); } else if(Zeichen == "?"){ schreiben.write(buffer13,3); } else if(Zeichen == "."){ schreiben.write(buffer14,3); } //else if(Zeichen == "..."){ //schreiben.write(buffer15,3); //} else if(Zeichen == "_"){ schreiben.write(buffer16,3); } else if(Zeichen == "é"){ schreiben.write(buffer17,3); } else if(Zeichen == ","){ schreiben.write(buffer18,3); } //else if(Zeichen == "<KREUZ>"){ //schreiben.write(buffer19,3); //} else if(Zeichen == "/"){ schreiben.write(buffer20,3); } else if(Zeichen == "A"){ schreiben.write(buffer21,3); } else if(Zeichen == "B"){ schreiben.write(buffer22,3); } else if(Zeichen == "C"){ schreiben.write(buffer23,3); } else if(Zeichen == "D"){ schreiben.write(buffer24,3); } else if(Zeichen == "E"){ schreiben.write(buffer25,3); } else if(Zeichen == "F"){ schreiben.write(buffer26,3); } else if(Zeichen == "G"){ schreiben.write(buffer27,3); } else if(Zeichen == "H"){ schreiben.write(buffer28,3); } else if(Zeichen == "I"){ schreiben.write(buffer29,3); } else if(Zeichen == "J"){ schreiben.write(buffer30,3); } else if(Zeichen == "K"){ schreiben.write(buffer31,3); } else if(Zeichen == "L"){ schreiben.write(buffer32,3); } else if(Zeichen == "M"){ schreiben.write(buffer33,3); } else if(Zeichen == "N"){ schreiben.write(buffer34,3); } else if(Zeichen == "O"){ schreiben.write(buffer35,3); } else if(Zeichen == "P"){ schreiben.write(buffer36,3); } else if(Zeichen == "Q"){ schreiben.write(buffer37,3); } else if(Zeichen == "R"){ schreiben.write(buffer38,3); } else if(Zeichen == "S"){ schreiben.write(buffer39,3); } else if(Zeichen == "T"){ schreiben.write(buffer40,3); } else if(Zeichen == "U"){ schreiben.write(buffer41,3); } else if(Zeichen == "V"){ schreiben.write(buffer42,3); } else if(Zeichen == "W"){ schreiben.write(buffer43,3); } else if(Zeichen == "X"){ schreiben.write(buffer44,3); } else if(Zeichen == "Y"){ schreiben.write(buffer45,3); } else if(Zeichen == "Z"){ schreiben.write(buffer46,3); } else if(Zeichen == "a"){ schreiben.write(buffer47,3); } else if(Zeichen == "b"){ schreiben.write(buffer48,3); } else if(Zeichen == "c"){ schreiben.write(buffer49,3); } else if(Zeichen == "d"){ schreiben.write(buffer50,3); } else if(Zeichen == "e"){ schreiben.write(buffer51,3); } else if(Zeichen == "f"){ schreiben.write(buffer52,3); } else if(Zeichen == "g"){ schreiben.write(buffer53,3); } else if(Zeichen == "h"){ schreiben.write(buffer54,3); } else if(Zeichen == "i"){ schreiben.write(buffer55,3); } else if(Zeichen == "j"){ schreiben.write(buffer56,3); } else if(Zeichen == "k"){ schreiben.write(buffer57,3); } else if(Zeichen == "l"){ schreiben.write(buffer58,3); } else if(Zeichen == "m"){ schreiben.write(buffer59,3); } else if(Zeichen == "n"){ schreiben.write(buffer60,3); } else if(Zeichen == "o"){ schreiben.write(buffer61,3); } else if(Zeichen == "p"){ schreiben.write(buffer62,3); } else if(Zeichen == "q"){ schreiben.write(buffer63,3); } else if(Zeichen == "r"){ schreiben.write(buffer64,3); } else if(Zeichen == "s"){ schreiben.write(buffer65,3); } else if(Zeichen == "t"){ schreiben.write(buffer66,3); } else if(Zeichen == "u"){ schreiben.write(buffer67,3); } else if(Zeichen == "v"){ schreiben.write(buffer68,3); } else if(Zeichen == "w"){ schreiben.write(buffer69,3); } else if(Zeichen == "x"){ schreiben.write(buffer70,3); } else if(Zeichen == "y"){ schreiben.write(buffer71,3); } else if(Zeichen == "z"){ schreiben.write(buffer72,3); } else if(Zeichen == "Ä"){ schreiben.write(buffer73,3); } else if(Zeichen == "Ö"){ schreiben.write(buffer74,3); } else if(Zeichen == "Ü"){ schreiben.write(buffer75,3); } else if(Zeichen == "ä"){ schreiben.write(buffer76,3); } else if(Zeichen == "ö"){ schreiben.write(buffer77,3); } else if(Zeichen == "ü"){ schreiben.write(buffer78,3); } //else if(Zeichen == "<BR>"){ //schreiben << "fe"; //} else{ schreiben << Zeichen; } current++; } cout << "[i] Wrote all Data!" << endl; lesen.close(); schreiben.close(); return 0; }
So also Jetzt zu meinen Ergebnissen:
Die orginal Pokemon Smaragt .gba ist ca. 16,8MB groß, die Datei die bei mir am Ende rauskommt ist ca 83MB groß, kann ja schonmal irgendwie nicht sein oder?
Und dann wenn ich sie mit nem Hex Editor öffne, sieht das ganze so aus: http://img402.imageshack.us/img402/8662/hexs.png
Warum schreibt mein Programm das a8 als ASCII in die Datei, nicht als Hex? Und warum vorallem NUR a8 und nicht das was ich eigendlich will?
Ich hoffe ihr könnt mir helfen, danke schonmal!
-
Kramurx schrieb:
Warum schreibt mein Programm das a8 als ASCII in die Datei, nicht als Hex?
Weil du das genau so programmiert hast. Außerdem gibt es kein "Hex".
So wäre es richtig:
const char c = '\xA8'; file.write(&c, 1);
Kramurx schrieb:
Und warum vorallem NUR a8 und nicht das was ich eigendlich will?
Keine Ahnung, zu unübersichtlich.
-
Nice danke! Aber das Problem das nur der erste Buchstabe geschrieben wird hab ich immernoch...
-
weg werfen, ordentlich doku lesen, dann in ungefähr 1% der Zeilen wieder neu machen. Dann findet man auch die Fehler.
-
Ich hab mir da jetzt nicht deinen ganzen Code angeschaut aber dein Problem scheint ja zur sein das du keine Binär Daten in eine Datei schreiben kannst.
Versuch dein Problem lieber erstmal aufzuteilen.Schau dir mal meinen Code an:
#include <iostream> #include <fstream> using namespace std; int main() { fstream file ( "datei.txt", ios::binary | ios::out ); char data[] = {"\x41\x42\x43\x90"}; file.write(data, sizeof(data)-1 ); return 0; }
\x41 = A
\x42 = B
\x42 = C
\x90 = NOP ( http://en.wikipedia.org/wiki/NOP )Der Inhalt der Datei sieht dann so aus: ABC
( Nicht alles was du in die Datei schreibst wird dir angezeigt, wenn du die Datei öffnest schreib mal \x00 rein, dann siehst du das die Datei zwar 1 kb hat aber es steht nichts drin. Wenn du die Datei aber dann mit einem Hexeditor öffnest dann sieht du auch das Nullbyte. )