Datei kürzen
-
Hallo , ich habe ein Problem, und zwar habe ich einen Code bekommen , dieser Funktioniert auch wunderbar...
Jedoch wird bei jeder Datei ein "DDS" am Anfang hinzu geschrieben.
Kann sich jemand mal den Code anschauen und mit mitteilen was ich ändern muß um einfach die ersten 3 Zeichen erst garnicht zu schreibenHier eine Beispielausgabe:
44 44 62 00 00 02 00 00
aber so sollte es sein
00 00 02 00 00
#define WIN32_LEAN_AND_MEAN #include <windows.h> #include <tchar.h> #include <stdlib.h> #include <stdio.h> #include <string> struct GELHeader { int i1; int i2; int numberOfElements; int i4; int i5; int i6; void print() { //printf( "i1 = %d\n", i1 ); //printf( "i2 = %d\n", i2 ); printf( "numberOfElements = %d\n", numberOfElements ); //printf( "i4 = %d\n", i4 ); //printf( "i5 = %d\n", i5 ); //printf( "i6 = %d\n", i6 ); printf( "\n" ); } }; struct GELEntry { int i1; int i2; char filename[128]; int i3; int startOffset; int dataSize; int i6; void print() { printf( "i1 = %d\n", i1 ); printf( "i2 = %d\n", i2 ); printf( "filename = %s\n", filename ); printf( "i3 = %d\n", i3 ); printf( "startOffset = %d\n", startOffset ); printf( "dataSize = %d\n", dataSize ); printf( "i6 = %d\n", i6 ); printf( "\n" ); } }; // Set this to the .GEL file that you want to extract std::string srcGel = "XXXX"; // Set this to the .GEM file that matches the .GEL file you want to extract std::string srcGem = "XXXX"; // This is the path where all the files will be extracted to std::string destPath = "XXXX"; int main() { FILE* gelFP = 0; fopen_s( &gelFP, srcGel.c_str(), "rb" ); if( gelFP ) { FILE* gemFP = 0; fopen_s( &gemFP, srcGem.c_str(), "rb" ); if( gemFP ) { GELHeader gelHeader; fread( &gelHeader, sizeof( GELHeader ), 1, gelFP ); gelHeader.print(); for( int i=0; i<gelHeader.numberOfElements; i++ ) { GELEntry gelEntry; fread( &gelEntry, sizeof( GELEntry ), 1, gelFP ); gelEntry.print(); printf( "\b\b\b\b\b\b\b%d", i + 1 ); if( gelEntry.dataSize > 0 ) { // Create the file std::string sFilename = gelEntry.filename; size_t pos = sFilename.find_last_of( "\\" ); std::string path = sFilename.substr( 0, pos + 1 ); std::string filename = sFilename.substr( pos + 1, sFilename.length() - pos ); printf( "Path = %s\nFile = %s\n", path.c_str(), filename.c_str() ); std::string newPath = destPath; newPath.append( path ); CreateDirectory ( newPath.c_str(), NULL ); // Detect GTX files (DDS files with the header changed and the extension changed pos = filename.find_last_of( "." ); //printf( "pos = %d\n", pos ); std::string ext = filename.substr( pos + 1, filename.length() - pos - 1 ); //printf( "ext = %s\n", ext.c_str() ); if( ext.find( "gtx" ) != std::string::npos ) { //printf( "Found GTX file!\n" ); char* data = (char*)malloc( gelEntry.dataSize ); fseek( gemFP, gelEntry.startOffset, 0 ); fread( data, gelEntry.dataSize, 1, gemFP ); if( data[0] == 'G' && data[1] == 'E' && data[2] == 'O' ) { // Most gtx files are DDS files with the "Magic Word" changed to GEO. We change that here, before // writing the file filename.replace( pos + 1, 3, "tga" ); std::string fullPath = newPath; fullPath.append( "\\" ); fullPath.append( filename ); data[0] = 'D'; data[1] = 'D'; data[2] = 'S'; FILE* outFP = 0; fopen_s( &outFP, fullPath.c_str(), "wb" ); if( outFP ) { fwrite( data, gelEntry.dataSize, 1, outFP ); fclose( outFP ); } } else if( data[0] == 'D' && data[1] == 'D' && data[2] == 'D' ) { // Sometimes, DDS files have the proper header in them filename.replace( pos + 1, 3, "tga" ); std::string fullPath = newPath; fullPath.append( "\\" ); fullPath.append( filename ); FILE* outFP = 0; fopen_s( &outFP, fullPath.c_str(), "wb" ); if( outFP ) { fwrite( data, gelEntry.dataSize, 1, outFP ); fclose( outFP ); } } else { // Haven't come across this yet, but just in case, we'll know. printf( "\n" ); printf( "Encountered UNKNOWN GTX file!\n" ); printf( "%c %c %c\n", data[0], data[1], data[2] ); printf( "\n" ); } free( data ); } else { std::string fullPath = newPath; fullPath.append( "\\" ); fullPath.append( filename ); FILE* outFP = 0; fopen_s( &outFP, fullPath.c_str(), "wb" ); if( outFP ) { void* data = malloc( gelEntry.dataSize ); fseek( gemFP, gelEntry.startOffset, 0 ); fread( data, gelEntry.dataSize, 1, gemFP ); fwrite( data, gelEntry.dataSize, 1, outFP ); free( data ); fclose( outFP ); } } } } printf( "\n\n" ); fclose( gemFP ); } fclose( gelFP ); } return 0; }
-
Dieser Thread wurde von Moderator/in volkard aus dem Forum C++ in das Forum Spiele-/Grafikprogrammierung verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Hallo
Schlechte Beschreibung. Wie wäre es, wenn du es ein einen String einliest und die gewünschten Elemente rauskickst?
Mfg.
way
-
Hab leider von C++ keine Ahnung
Also mein Problem ist , ich habe 2 Files , eins ist sozusagen ein Inhaltsverzeichnis , das andere enthält die Daten.
Dieses Script entpackt das Datenfile und schreibt die einzelnen Files die im Datenfile sind.
Dies klappt auch wunderbar, jedoch ist das Problem das es sich um TGA Dateien handelt. Diese Fangen immer mit dem Hex Code "00 00 02" an , leider schreibt das Script jedoch ein DDS "44 44 53" vor dem eigentlichen Code und aus diesem Grund kann die Datei erst angezeigt werden wenn ich von Hand die ersten 3 Zeichen mit einem Hexeditor entferne.
Da es sich aber um einige Tausend Files handelt die entpackt werden ist dies sehr Zeitaufwendig.Vielleicht kann mir jemand zeigen wo ich was umschreiben muß damit die ersten 3 Zeichen erst garnicht in die erzeugten Files geschrieben wird.
Danke
-
Habs jetzt nur überflogen ...
Zeile 118-120 enthält was du suchst bzw nicht suchst
-
Hab ich auch schon gefunden , danke.
Nur wie bekomme ich es hin das er das nicht in die Datei schreibt
Bzw er ersetzt ja das GEO durch DDS , kann man das aus dem String der ins File geschrieben wird herauslöschen
-
Hallo
Der ersetzt in den 3 Zeilen doch einfach nur die ersten 3 Buchstaben, egal was da steht, entweder due kommentierts die 3 Zeilen einfach aus oder du schreibst statt DDS ein GEO hin also so in etwa:
... data[0] = 'G'; data[1] = 'E'; data[2] = 'O'; ...
Mfg Marco
-
Danke
hat das Problem jedoch nicht behoben.
Die Zeichenfolge GEO ist in der Datendatei nur eine Markierung für den Beginn der Filedaten, jedoch die Markierung selber ist überflüssig, sprich ich muß die nicht ersetzen sondern löschen , egal was dort steht.MfG
-
Hallo
Tschuldigung hab ich bischen falsch dann verstanden, dann probierst doch eher in der Zeile 125. In der schreibst du die Daten in die Datei, und da musst du der Funktion einfach mitteilen das du erst 3 Byte später anfangen musst und dann dafür auch 3 Byte weniger. So in etwa sollte es funktionieren (nicht getestet):
... fwrite( &(data[3]), (gelEntry.dataSize-3), 1, outFP ) ...
Mfg Marco
-
Boa geil ein ganz dickes DANKE
hat wunderbar geklappt
DANKE