Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <map>
- #include <iostream>
- typedef unsigned char byte;
- typedef unsigned int uint;
- char* LoadFileToBuffer(char* filename, long& filelen)
- {
- FILE *fileptr;
- char *buffer;
- fopen_s(&fileptr, filename, "rb");
- if (fileptr == 0)
- {
- return 0;
- }
- fseek(fileptr, 0, SEEK_END);
- filelen = ftell(fileptr);
- rewind(fileptr);
- buffer = (char *)malloc((filelen + 1)*sizeof(char));
- fread(buffer, filelen, 1, fileptr);
- fclose(fileptr);
- return buffer;
- }
- void DumpHex(byte* pc, long len)
- {
- unsigned char buff[17];
- for (int i = 0; i < len; ++i)
- {
- if ((i % 16) == 0)
- {
- if (i != 0)
- {
- printf(" %s\n", buff);
- }
- printf(" %04x ", i);
- }
- printf(" %02x", pc[i]);
- if ((pc[i] < 0x20) || (pc[i] > 0x7e))
- {
- buff[i % 16] = '.';
- }
- else
- {
- buff[i % 16] = pc[i];
- }
- buff[(i % 16) + 1] = '\0';
- }
- }
- inline uint fromLilEndian(byte* offb)
- {
- return offb[0] | (offb[1] << 8) | (offb[2] << 16) | (offb[3] << 24);
- }
- void Usage()
- {
- std::cout << "***** sinESEDEKA v0.001 alfaromeo *****" << std::endl
- << "!!! IMPORTANT: Put \"sc2000.dat\" in this very folder" << std::endl
- << std::endl
- << "Commands:" << std::endl
- << "h - notHing" << std::endl
- << "x - eXtract" << std::endl
- << "c - Compose" << std::endl
- << "d - Dump hex file" << std::endl
- << std::endl;
- }
- struct FileInfo
- {
- long len;
- byte* dat;
- std::map<std::string, FileInfo> fmap;
- };
- typedef std::map<std::string, FileInfo> Filemap;
- FileInfo ParseFile(const char* filename)
- {
- FileInfo sc2000;
- sc2000.dat = (byte*)LoadFileToBuffer("sc2000.dat", sc2000.len);
- if (sc2000.dat == 0)
- {
- std::cout << "> You really have to put \"sc2000.dat\" in this very folder" << std::endl;
- exit(0);
- }
- const int NUM_FILES = 398;
- uint offset_before = 0;
- std::string prev_file;
- for (int i = 0; i < NUM_FILES; ++i)
- {
- byte* p = (sc2000.dat + i * 16);
- char filename[13];
- strncpy_s(filename, (const char *)p, 12);
- std::string file(filename);
- uint offset = fromLilEndian(p + 12);
- sc2000.fmap[file].dat = (sc2000.dat + offset);
- if (i >= 1)
- {
- sc2000.fmap[prev_file].len = (offset - offset_before);
- }
- offset_before = offset;
- prev_file = file;
- }
- //Last file
- sc2000.fmap[prev_file].len = sc2000.len - offset_before;
- return sc2000;
- }
- void Extract(FileInfo sc2000)
- {
- Filemap::iterator it = sc2000.fmap.begin();
- for (; it != sc2000.fmap.end(); it++)
- {
- FILE* dumpFile;
- fopen_s(&dumpFile, it->first.c_str(), "wb");
- fwrite(it->second.dat, sizeof(byte), it->second.len, dumpFile);
- }
- }
- int main(int argc, char* argv[])
- {
- if (argc == 1 || argc > 2)
- {
- Usage();
- exit(0);
- }
- {
- switch (argv[1][0])
- {
- case 'd':
- {
- FileInfo sc2000 = ParseFile("sc2000.dat");
- DumpHex(sc2000.dat, sc2000.len);
- } break;
- case 'x':
- {
- FileInfo sc2000 = ParseFile("sc2000.dat");
- Extract(sc2000);
- } break;
- case 'c':
- {
- std::cout << "Not yet implemented" << std::endl;
- exit(0);
- } break;
- default:
- {
- Usage();
- } break;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement