Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

[ÜBERSETZUNG] Von CPP nach FB

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Profi-Forum
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
PMedia



Anmeldungsdatum: 14.08.2006
Beiträge: 2847

BeitragVerfasst am: 14.07.2007, 01:44    Titel: [ÜBERSETZUNG] Von CPP nach FB Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
AndT



Anmeldungsdatum: 02.04.2007
Beiträge: 481

BeitragVerfasst am: 16.07.2007, 21:44    Titel: Antworten mit Zitat

Ä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
Benutzer-Profile anzeigen Private Nachricht senden
PMedia



Anmeldungsdatum: 14.08.2006
Beiträge: 2847

BeitragVerfasst am: 16.07.2007, 21:45    Titel: Antworten mit Zitat

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 happy
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
AndT



Anmeldungsdatum: 02.04.2007
Beiträge: 481

BeitragVerfasst am: 16.07.2007, 22:04    Titel: Antworten mit Zitat

am sonsten wird wohl auch http://www.cplusplus.com/reference/ weiterhelfen zwinkern
(oben gibts ne suchfunktion)
einfach da den unbekannten befehl eingeben zwinkern
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
PMedia



Anmeldungsdatum: 14.08.2006
Beiträge: 2847

BeitragVerfasst am: 16.07.2007, 22:11    Titel: Antworten mit Zitat

Es geht nicht um die Befehle sondern um die Struktur an sich happy
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
AndT



Anmeldungsdatum: 02.04.2007
Beiträge: 481

BeitragVerfasst am: 16.07.2007, 22:23    Titel: Antworten mit Zitat

Freebasic hat übrigens auch Headerdateien für c und cpp happy
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. zwinkern
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
PMedia



Anmeldungsdatum: 14.08.2006
Beiträge: 2847

BeitragVerfasst am: 16.07.2007, 22:35    Titel: Antworten mit Zitat

*freu*
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
AndT



Anmeldungsdatum: 02.04.2007
Beiträge: 481

BeitragVerfasst am: 17.07.2007, 12:26    Titel: Antworten mit Zitat

ok

Zuletzt bearbeitet von AndT am 17.07.2007, 12:30, insgesamt 2-mal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
PMedia



Anmeldungsdatum: 14.08.2006
Beiträge: 2847

BeitragVerfasst am: 17.07.2007, 12:29    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4594
Wohnort: ~/

BeitragVerfasst am: 17.07.2007, 12:38    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
csde_rats



Anmeldungsdatum: 07.01.2007
Beiträge: 2292
Wohnort: Zwischen Sessel und Tastatur

BeitragVerfasst am: 17.07.2007, 13:49    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4594
Wohnort: ~/

BeitragVerfasst am: 17.07.2007, 14:11    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Mao



Anmeldungsdatum: 25.09.2005
Beiträge: 4409
Wohnort: /dev/hda1

BeitragVerfasst am: 17.07.2007, 19:15    Titel: Antworten mit Zitat

u8=Unsigned Byte
u16=Unsigned Short
u32=Unsigned Integer
c8=Byte (afaik signed!)
_________________
Eine handvoll Glück reicht nie für zwei.
--
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
csde_rats



Anmeldungsdatum: 07.01.2007
Beiträge: 2292
Wohnort: Zwischen Sessel und Tastatur

BeitragVerfasst am: 17.07.2007, 19:29    Titel: Antworten mit Zitat

[ot]
Kann mir jemand einmal den unterschied zwischen signed und unsigned erklären?
[/ot]
_________________
If hilfreicher_Beitrag then klick(location.here)

Klick
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4594
Wohnort: ~/

BeitragVerfasst am: 17.07.2007, 19:39    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
csde_rats



Anmeldungsdatum: 07.01.2007
Beiträge: 2292
Wohnort: Zwischen Sessel und Tastatur

BeitragVerfasst am: 17.07.2007, 19:47    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
AndT



Anmeldungsdatum: 02.04.2007
Beiträge: 481

BeitragVerfasst am: 18.07.2007, 13:38    Titel: Antworten mit Zitat

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 happy)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
PMedia



Anmeldungsdatum: 14.08.2006
Beiträge: 2847

BeitragVerfasst am: 18.07.2007, 15:47    Titel: Antworten mit Zitat

Also wenn du es fertig hast, schickst es mir bitte einfach, getestet werden kanns nur von mir da ich die Images hab happy
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
AndT



Anmeldungsdatum: 02.04.2007
Beiträge: 481

BeitragVerfasst am: 18.07.2007, 16:55    Titel: Antworten mit Zitat

Das dauert noch happy
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Profi-Forum Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz