Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <QtCore/QCoreApplication>
- #include <QStringList>
- #include <QFile>
- bool isBeginning(QFile& f, qint64 offset)
- {
- qDebug("offset: 0x%x", offset);
- int size = f.size();
- int dataSize = size - offset;
- f.seek(offset - 12);
- QByteArray data = f.read(12);
- quint32* d = (quint32*)data.data();
- if(d[0] == d[1])
- {
- int dataSize2 = d[0] * d[0] * d[2] / 8;
- return (dataSize == dataSize2);
- }
- else
- {
- return false;
- }
- }
- int main(int argc, char *argv[])
- {
- QCoreApplication a(argc, argv);
- QStringList args = a.arguments();
- if(args.size() != 3)
- {
- qCritical("Usage: %s <infile.L15> <outfile.pgm>", argv[0]);
- return 1;
- }
- QString finame = args[1];
- QString foname = args[2];
- QFile fi(finame);
- QFile fo(foname);
- if(!fi.open(QFile::ReadOnly))
- {
- qCritical("Can't open file %s", qPrintable(finame));
- return 1;
- }
- if(!fo.open(QFile::WriteOnly))
- {
- fi.close();
- qCritical("Can't open file %s", qPrintable(foname));
- return 1;
- }
- qint64 size = fi.size();
- qDebug("File size: %ld", size);
- int k = 0;
- if(size>(11136*11136*2))
- {
- k = 11136;
- }
- else if(size>(2784*2784*2))
- {
- k = 2784;
- }
- qDebug("Data size: %ld", k*k*2);
- qDebug("k=%d", k);
- qint64 offset = 0;
- if(k>0)
- {
- if(isBeginning(fi, size - (k*k*2)))
- {
- offset = size - (k*k*2);
- qDebug("Found");
- }
- }
- if(offset==0)
- {
- for(qint64 i=0; i<size-20; i++)
- {
- if(isBeginning(fi, i))
- {
- offset = i;
- break;
- }
- }
- }
- if(offset==0)
- {
- fi.close();
- fo.close();
- qCritical("Header not found");
- return 1;
- }
- fi.seek(offset-12);
- QByteArray header = fi.read(16);
- quint32* headPtr = (quint32*)header.data();
- quint32 w = headPtr[0];
- quint32 h = headPtr[1];
- quint32 d = headPtr[2];
- Q_ASSERT(d==16);
- QString pgmHeader = QString("P5\n%1 %2\n65535\n").arg(w).arg(h);
- fo.write(qPrintable(pgmHeader));
- fi.seek(offset);
- while(offset < size)
- {
- QByteArray data = fi.read(1024);
- quint8* ptr = (quint8*)data.data();
- for(int i=0; i<data.size(); i+=2, ptr+=2)
- {
- quint8 t = ptr[0];
- ptr[0] = ptr[1];
- ptr[1] = t;
- }
- fo.write(data);
- offset += 1024;
- }
- fi.close();
- fo.close();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement