2015-09-23 3 views
0

Я пытаюсь восстановить изображение из файла, который находится в формате Intel hex 386. После разбора файла все данные, которые я копирую в QByteArray, и тот же массив используется для создания объекта QImage. Но любое изображение, которое я получил после реконструкции, не является совершенным. Я получаю синий цвет вместо черного, края не ясны и т. Д. Текстовый файл, который я обрабатываю, является дампом памяти RAM от контроллера STM32F4 (рука). Изображение хранится в формате RGB565.Не удалось восстановить изображение RGB565 из необработанных данных с помощью QImage

код для создания изображения:

{ 
    QString strFilename; 
    Hex386Parser oFileParser; 
    strFilename = QFileDialog::getOpenFileName(this,"Select a file", QDir::homePath()); 
    oFileParser.parseFile(strFilename, oByteArray); 
    QImage image(320, 240, QImage::Format_RGB16); 

    for (int y = 0; y < image.height(); y++) 
    { 
     memcpy(image.scanLine(y), oByteArray.constData() + y * image.bytesPerLine(), 
      image.bytesPerLine()); 
    } 

    qDebug() <<"Size of the byte array is " <<oByteArray.size(); 
    QLabel *label = new QLabel(); 
    label->setPixmap(QPixmap::fromImage(image)); 
    label->show(); 
} 

Код для используется для разбора файла:

#define QT_NO_CAST_TO_ASCII 
void Hex386Parser::parseFile(QString strFilename,QByteArray& ref_ByteArray) 
{ 
    QFile oFile(strFilename); 
    std::stringstream sstr; 
    QString strLength; 

    int unLength = 0, unAddress = 0,unDescriptor =0xFFFF,nIndex =0,nlineno=0; 
    if (oFile.open((QIODevice::ReadOnly | QIODevice::Text))) 
    { 
     QTextStream in(&oFile); 
     while (!in.atEnd()) 
     { 
      QString line = in.readLine(); 
      nIndex = 0; 
      nlineno++; 
      //unsigned char *pCharFrame = (unsigned char *)line.toStdString().c_str(); 
      if (':' != line.at(nIndex)) 
      { 
       // file corrupted 
       return; 
      } 
      nIndex++; 

      { 
       strLength = line.mid(nIndex, 2); 
       sstr << strLength.toStdString(); 
       sstr << std::hex; 
       sstr >> unLength; // get length of the record 
       strLength.clear(); 
       sstr.clear(); 
      } 

      nIndex += 2; 
      unAddress = line.mid(nIndex,4).toInt(); // get address bytes 
      nIndex +=4; 
      unDescriptor = line.mid(nIndex, 2).toInt(); // get data descriptor 
      nIndex += 2; 
      switch(unDescriptor) 
      { 
      case data_record: 
       ref_ByteArray.append((line.mid(nIndex, unLength))); 
       // add data to bytearray 
       break; 
      case end_of_file_record: 
       break; 
      case extended_segment_address_record: 
       break; 
      case extended_linear_address_record: 
       break; 
      case start_linear_address_record: 
       break; 
      } 
     } 
     oFile.close(); 
    } 
} 

Что я делаю не так ??

ответ

0

line содержит представления данных в виде шестнадцатеричных строк, где каждый байт кодируется как два символа.

Вы хотите бинарные байты. Таким образом, символы 2 * unLength следует читать с line. Затем эта строка данных должна быть преобразована в двоичную, например:

{ 
case data_record: 
    QByteArray hex = line.mid(nIndex, 2 * unLength).toLatin1(); 
    QByteArray binary = QByteArray::fromHex(hex); 
    ref_ByteArray.append(binary); 
... 
}