Advertisement
Guest User

Untitled

a guest
Feb 20th, 2013
1,001
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.67 KB | None | 0 0
  1. #include <QtCore/QCoreApplication>
  2. #include <QStringList>
  3. #include <QFile>
  4.  
  5. bool isBeginning(QFile& f, qint64 offset)
  6. {
  7.     qDebug("offset: 0x%x", offset);
  8.     int size = f.size();
  9.     int dataSize = size - offset;
  10.  
  11.     f.seek(offset - 12);
  12.     QByteArray data = f.read(12);
  13.  
  14.     quint32* d = (quint32*)data.data();
  15.  
  16.     if(d[0] == d[1])
  17.     {
  18.         int dataSize2 = d[0] * d[0] * d[2] / 8;
  19.         return (dataSize == dataSize2);
  20.     }
  21.     else
  22.     {
  23.         return false;
  24.     }
  25. }
  26.  
  27. int main(int argc, char *argv[])
  28. {
  29.     QCoreApplication a(argc, argv);
  30.  
  31.     QStringList args = a.arguments();
  32.     if(args.size() != 3)
  33.     {
  34.         qCritical("Usage: %s <infile.L15> <outfile.pgm>", argv[0]);
  35.         return 1;
  36.     }
  37.  
  38.     QString finame = args[1];
  39.     QString foname = args[2];
  40.  
  41.     QFile fi(finame);
  42.     QFile fo(foname);
  43.  
  44.     if(!fi.open(QFile::ReadOnly))
  45.     {
  46.         qCritical("Can't open file %s", qPrintable(finame));
  47.         return 1;
  48.     }
  49.     if(!fo.open(QFile::WriteOnly))
  50.     {
  51.         fi.close();
  52.         qCritical("Can't open file %s", qPrintable(foname));
  53.         return 1;
  54.     }
  55.  
  56.     qint64 size = fi.size();
  57.  
  58.     qDebug("File size: %ld", size);
  59.  
  60.     int k = 0;
  61.     if(size>(11136*11136*2))
  62.     {
  63.         k = 11136;
  64.     }
  65.     else if(size>(2784*2784*2))
  66.     {
  67.         k = 2784;
  68.     }
  69.  
  70.     qDebug("Data size: %ld", k*k*2);
  71.     qDebug("k=%d", k);
  72.  
  73.     qint64 offset = 0;
  74.     if(k>0)
  75.     {
  76.         if(isBeginning(fi, size - (k*k*2)))
  77.         {
  78.             offset = size - (k*k*2);
  79.             qDebug("Found");
  80.         }
  81.     }
  82.  
  83.     if(offset==0)
  84.     {
  85.         for(qint64 i=0; i<size-20; i++)
  86.         {
  87.             if(isBeginning(fi, i))
  88.             {
  89.                 offset = i;
  90.                 break;
  91.             }
  92.         }
  93.     }
  94.  
  95.     if(offset==0)
  96.     {
  97.         fi.close();
  98.         fo.close();
  99.         qCritical("Header not found");
  100.         return 1;
  101.     }
  102.  
  103.     fi.seek(offset-12);
  104.     QByteArray header = fi.read(16);
  105.     quint32* headPtr = (quint32*)header.data();
  106.     quint32 w = headPtr[0];
  107.     quint32 h = headPtr[1];
  108.     quint32 d = headPtr[2];
  109.     Q_ASSERT(d==16);
  110.  
  111.     QString pgmHeader = QString("P5\n%1 %2\n65535\n").arg(w).arg(h);
  112.  
  113.     fo.write(qPrintable(pgmHeader));
  114.  
  115.     fi.seek(offset);
  116.     while(offset < size)
  117.     {
  118.         QByteArray data = fi.read(1024);
  119.         quint8* ptr = (quint8*)data.data();
  120.         for(int i=0; i<data.size(); i+=2, ptr+=2)
  121.         {
  122.             quint8 t = ptr[0];
  123.             ptr[0] = ptr[1];
  124.             ptr[1] = t;
  125.         }
  126.         fo.write(data);
  127.         offset += 1024;
  128.     }
  129.  
  130.     fi.close();
  131.     fo.close();
  132.    
  133.     return 0;
  134. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement