Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
PMedia
Anmeldungsdatum: 14.08.2006 Beiträge: 2847
|
Verfasst am: 14.07.2007, 02:44 Titel: [ÜBERSETZUNG] Von CPP nach FB |
|
|
Kann mir bitte jemand folgenden Quelltext übersetzen? Meine Sprachkenntnisse reichen offenbar nicht dafür:
Code: | //version 1.0 (20050213)
//by thakis
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <vector>
#include <string>
#include <iterator>
#include <stack>
#include <direct.h>
using namespace std;
typedef unsigned char u8;
typedef unsigned short u16;
typedef unsigned int u32;
typedef char c8;
typedef FILE* GcmFile;
int min(int a, int b)
{ return a<b?a:b; }
void toWORD(u16& w)
{
u8 w1 = w & 0xFF;
u8 w2 = w >> 8;
w = (w1 << 8) | w2;
}
void toDWORD(u32& d)
{
u8 w1 = d & 0xFF;
u8 w2 = (d >> 8) & 0xFF;
u8 w3 = (d >> 16) & 0xFF;
u8 w4 = d >> 24;
d = (w1 << 24) | (w2 << 16) | (w3 << 8) | w4;
}
#pragma pack(push, 1)
struct GameCode
{
u8 consoleId;
union
{
u16 gameCode;
u8 gameCodeArr[2];
};
u8 countryCode;
union
{
u16 makerCode;
c8 makerCodeArr[2];
};
};
struct DiskHeader
{
GameCode gameCode;
u8 diskId, version, audioStreaming, streamBufferSize;
u8 unused[0x12];
union
{
u32 dvdMagicWord;
c8 dvdMagicWordArr[4];
};
c8 gameName[0x3e0];
u32 debugMonitorOffset;
u32 debugLoadAddress;
u8 unused2[0x18];
u32 dolOffset;
u32 fstOffset;
u32 fstSize;
u32 fstMaximumSize;
u32 userPosition;
u32 userLength;
u32 unknown;
u32 unused3;
};
struct FileEntry
{
u8 isDirectory; //0: file, 1: dir
u32 fileNameOffset; //this is only 3 bytes on the disk :-(
union
{
u32 fileOffset; //file
u32 parentOffset; //dir
};
union
{
u32 numEntries; //for root entry
u32 fileLength; //file
u32 nextOffset; //dir
};
string name;
};
struct FileEntryImpl //this is how it's stored on-disk
{
u8 isDirectory;
u8 fileNameOffset[3]; //sadly, this is a 3-byte number...
u32 fileOffset;
u32 nextOffset;
};
struct FileSystemTable
{
vector<FileEntry> entries;
//vector<string> fileNames;
};
#pragma pack(pop)
GcmFile openGcm(const char* fileName)
{
return fopen(fileName, "rb");
}
int closeGcm(GcmFile file)
{
return fclose(file);
}
int readDiskHeader(GcmFile f, DiskHeader& header)
{
fseek(f, 0, SEEK_SET);
size_t ret = fread(&header, sizeof(DiskHeader), 1, f);
toDWORD(header.dvdMagicWord);
toDWORD(header.debugMonitorOffset);
toDWORD(header.debugLoadAddress);
toDWORD(header.dolOffset);
toDWORD(header.fstOffset);
toDWORD(header.fstSize);
toDWORD(header.fstMaximumSize);
toDWORD(header.userPosition);
toDWORD(header.userLength);
toDWORD(header.unknown);
toDWORD(header.unused3);
return ret;
}
int readEntry(GcmFile f, FileEntry& entry)
{
FileEntryImpl feImpl;
fread(&feImpl, sizeof(FileEntryImpl), 1, f);
toDWORD(feImpl.fileOffset);
toDWORD(feImpl.nextOffset);
entry.isDirectory = feImpl.isDirectory;
entry.fileNameOffset =
(feImpl.fileNameOffset[0] << 16) |
(feImpl.fileNameOffset[1] << 8) |
feImpl.fileNameOffset[2];
entry.fileOffset = feImpl.fileOffset;
entry.nextOffset = feImpl.nextOffset;
return 1;
}
int readFST(GcmFile f, const DiskHeader& header, FileSystemTable& fst)
{
fseek(f, header.fstOffset, SEEK_SET);
//read files
int numFiles = 1;
for(int i = 0; i < numFiles; ++i)
{
FileEntry entry;
readEntry(f, entry);
fst.entries.push_back(entry);
if(i == 0)
numFiles = entry.numEntries;
}
//read filename table
/*
u32 readBytes = sizeof(FileEntryImpl)*fst.entries.size();
while(readBytes < header.fstSize)
{
string currString;
char c;
++readBytes; //0 char
while((c = fgetc(f)) != '\0' && readBytes < header.fstSize)
{
++readBytes; currString.append(1, c);
}
fst.fileNames.push_back(currString);
}
//*/
int fileTableOffset = sizeof(FileEntryImpl)*fst.entries.size();
for(int j = 0; j < fst.entries.size(); ++j)
{
fseek(f, header.fstOffset + fileTableOffset + fst.entries[j].fileNameOffset, SEEK_SET);
int readBytes = fileTableOffset + fst.entries[j].fileNameOffset;
char c;
++readBytes; //0 char
while((c = fgetc(f)) != '\0' && readBytes < header.fstSize)
{
++readBytes; fst.entries[j].name.append(1, c);
}
}
return 1;
}
int main(int argc, char* argv[])
{
if(argc < 2)
return EXIT_FAILURE;
DiskHeader header;
FileSystemTable fst;
GcmFile f = openGcm(argv[1]);
if(f == NULL)
return EXIT_FAILURE;
readDiskHeader(f, header);
readFST(f, header, fst);
//copy file system to harddisk
//for now, dump directory structure
//*
string path;
cout << fst.entries.size() << " file system entries:" << endl;
stack<int> directoryEnd;
directoryEnd.push(fst.entries.size());
string dirName = argv[1] + string("_dir");
_mkdir(dirName.c_str());
_chdir(dirName.c_str());
for(int i = 1; i < fst.entries.size(); ++i)
{
FileEntry& e = fst.entries[i];
string name;
while(i >= directoryEnd.top())
{
directoryEnd.pop();
path = path.substr(0, path.rfind('/'));
_chdir("..");
}
if(e.isDirectory)
{
directoryEnd.push(e.nextOffset);
_mkdir(e.name.c_str());
_chdir(e.name.c_str());
path = "/" + e.name;
int off = fst.entries[i].parentOffset;
while(off != 0)
{
path = "/" + fst.entries[off].name + path;
off = fst.entries[off].parentOffset;
}
//cout << path << endl;
name = path;
}
else
{
name = path + "/" + e.name;
FILE* outFile = fopen(e.name.c_str(), "wb");
u32 read = 0;
u8 buff[1024];
fseek(f, e.fileOffset, SEEK_SET);
while(read < e.fileLength)
{
int r = fread(buff, 1, min(1024, e.fileLength - read), f);
fwrite(buff, 1, r, outFile);
read += r;
}
fclose(outFile);
}
cout << name << endl;
}
//*/
closeGcm(f);
//cout << fst.entries.size() << " filenames" << endl;
//copy(fst.entries.begin(), fst.fileNames.end(), ostream_iterator<string>(cout, "\n"));
return EXIT_SUCCESS;
}
|
|
|
Nach oben |
|
|
AndT
Anmeldungsdatum: 02.04.2007 Beiträge: 481
|
Verfasst am: 16.07.2007, 22:44 Titel: |
|
|
Ähm ja als cpp Exe läufts und macht keine Textausgabe und erstellt auch keine Datei.
(getestet mit VmWare und Dev-C++)
Wenn das so sein soll könnte ich es versuchen. |
|
Nach oben |
|
|
PMedia
Anmeldungsdatum: 14.08.2006 Beiträge: 2847
|
Verfasst am: 16.07.2007, 22:45 Titel: |
|
|
Es erstellt eine Datei, wenn es ein GCM-Image als Parameter bekommt. Von daher müsste es blind übersetzt werden, da ich die hab, und mit 1,5 GB auch wenig portabel sind |
|
Nach oben |
|
|
AndT
Anmeldungsdatum: 02.04.2007 Beiträge: 481
|
Verfasst am: 16.07.2007, 23:04 Titel: |
|
|
am sonsten wird wohl auch http://www.cplusplus.com/reference/ weiterhelfen
(oben gibts ne suchfunktion)
einfach da den unbekannten befehl eingeben |
|
Nach oben |
|
|
PMedia
Anmeldungsdatum: 14.08.2006 Beiträge: 2847
|
Verfasst am: 16.07.2007, 23:11 Titel: |
|
|
Es geht nicht um die Befehle sondern um die Struktur an sich |
|
Nach oben |
|
|
AndT
Anmeldungsdatum: 02.04.2007 Beiträge: 481
|
Verfasst am: 16.07.2007, 23:23 Titel: |
|
|
Freebasic hat übrigens auch Headerdateien für c und cpp
ja es gibt sogar eine stdio.bi die dafür sorgt dass der Grossteil des Codes so mit übernommen werden kann. Ich denke mal Morgen hab ich ihn soweit fertig. |
|
Nach oben |
|
|
PMedia
Anmeldungsdatum: 14.08.2006 Beiträge: 2847
|
Verfasst am: 16.07.2007, 23:35 Titel: |
|
|
*freu* |
|
Nach oben |
|
|
AndT
Anmeldungsdatum: 02.04.2007 Beiträge: 481
|
Verfasst am: 17.07.2007, 13:26 Titel: |
|
|
ok
Zuletzt bearbeitet von AndT am 17.07.2007, 13:30, insgesamt 2-mal bearbeitet |
|
Nach oben |
|
|
PMedia
Anmeldungsdatum: 14.08.2006 Beiträge: 2847
|
Verfasst am: 17.07.2007, 13:29 Titel: |
|
|
int müsste integer sein
typedef sieht mir nach der Definition eines neuen Variablentyps, ähnlich Type, aus.
Code: | typedef unsigned char u8;
typedef unsigned short u16;
typedef unsigned int u32;
typedef char c8; |
könnte also gleichzustellen sein mit
Code: | #define u8 ubyte
#define u16 ushort
#define u32 uinteger
#define c8 ubyte |
|
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4597 Wohnort: ~/
|
Verfasst am: 17.07.2007, 13:38 Titel: |
|
|
Wobei char vermutlich nicht als Zahl gehandhabt wird, sondern eben als Zeichen (ist aber auch nicht dasselbe wie ein String der Länge 1). _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
csde_rats
Anmeldungsdatum: 07.01.2007 Beiträge: 2292 Wohnort: Zwischen Sessel und Tastatur
|
Verfasst am: 17.07.2007, 14:49 Titel: |
|
|
Code: | typedef unsigned char u8;
typedef unsigned short u16;
typedef unsigned int u32;
typedef char c8; |
Das sieht mir eher aus wie:
-ASCII-1-Zeichen-String
-Unicode-16-1-Zeichen-String
-Unicode-32-1-Zeichen-String
-ANSI (?) _________________ If hilfreicher_Beitrag then klick(location.here)
Klick |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4597 Wohnort: ~/
|
Verfasst am: 17.07.2007, 15:11 Titel: |
|
|
Mal wild aus dem Netz gegriffen:
http://tutorial.schornboeck.net/typedef.htm _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
Mao
Anmeldungsdatum: 25.09.2005 Beiträge: 4409 Wohnort: /dev/hda1
|
Verfasst am: 17.07.2007, 20:15 Titel: |
|
|
u8=Unsigned Byte
u16=Unsigned Short
u32=Unsigned Integer
c8=Byte (afaik signed!) _________________ Eine handvoll Glück reicht nie für zwei.
--
|
|
Nach oben |
|
|
csde_rats
Anmeldungsdatum: 07.01.2007 Beiträge: 2292 Wohnort: Zwischen Sessel und Tastatur
|
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4597 Wohnort: ~/
|
Verfasst am: 17.07.2007, 20:39 Titel: |
|
|
Beim Typ Byte z. B. ist
unsigned: von 0 bis 255
signed: von -128 bis 127
also signed = Zahl mit Vorzeichen _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
csde_rats
Anmeldungsdatum: 07.01.2007 Beiträge: 2292 Wohnort: Zwischen Sessel und Tastatur
|
Verfasst am: 17.07.2007, 20:47 Titel: |
|
|
nemored hat Folgendes geschrieben: | Beim Typ Byte z. B. ist
unsigned: von 0 bis 255
signed: von -128 bis 127
also signed = Zahl mit Vorzeichen | Ahh, kannte das unter einer anderen Bezeichnung, danke.... _________________ If hilfreicher_Beitrag then klick(location.here)
Klick |
|
Nach oben |
|
|
AndT
Anmeldungsdatum: 02.04.2007 Beiträge: 481
|
Verfasst am: 18.07.2007, 14:38 Titel: |
|
|
Muss der Code
Code: |
typedef FILE* GcmFile
|
mit Rein?
wenn ich in einsezte steht nichts in der Datei und wenn er nicht drinn ist dann kackt das Programm einfach ab aber dafür steht da EIN! Zeichen drinn xD.
//
Ach hat sich erledigt..
Das war nur ein Teilungsfehler in einer der Varibalen
Wenn denn Irgendwie wurde duch Null geteilt und es kam 1 raus LOL.
(Anstelle von +1 ) |
|
Nach oben |
|
|
PMedia
Anmeldungsdatum: 14.08.2006 Beiträge: 2847
|
Verfasst am: 18.07.2007, 16:47 Titel: |
|
|
Also wenn du es fertig hast, schickst es mir bitte einfach, getestet werden kanns nur von mir da ich die Images hab |
|
Nach oben |
|
|
AndT
Anmeldungsdatum: 02.04.2007 Beiträge: 481
|
Verfasst am: 18.07.2007, 17:55 Titel: |
|
|
Das dauert noch |
|
Nach oben |
|
|
|