Russian Qt Forum
Ноябрь 24, 2024, 19:54 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Не корректно записываются данные в файл  (Прочитано 2578 раз)
yura91
Гость
« : Июнь 09, 2016, 17:57 »

Я передаю изображение с клиента андроид на TCP сервер Qt(так же вместе с ним передаются и текстовые данные
Передаю сначала ESC, размер изображения а потом сами данные. На сервере принимаю и порциями пишу в файл. Но на файле снизу постоянно появляется черная  полоса как на скрине.
Ниже код сервера. Подскажите в чем у меня ошибка? Почему в файле отображается эта полоса что я не так делаю?
#include "server.h"
#include <iostream>
#include <cstdio>
#include "wavstructfile.h"
using namespace std;
#include <QDataStream>
#include <QImage>
#include <QPalette>
#include <QWidget>
#include <QByteArray>
#include <stdio.h>

QFile filetxt;
FILE*filesound;
FILE*writeJpg;
FILE*file;
int i;

int size;
int sizeBin;
const char STX = '\u0002';
const char ETX = '\u0003';
typedef enum {dmNone,dmBinary,dmText} TDataMode;
TDataMode Mode = dmNone;
const char ESC = 27;
char convert;
char* ptr;
int siz;
int BufSize;
char buf[sizeof(double)];
double d;
//char* TextBuff;

int byteArrayToInt(QByteArray b)
  {
      return   b[3] & 0xFF |
              (b[2] & 0xFF) << 8 |
              (b[1] & 0xFF) << 16 |
              (b[0] & 0xFF) << 24;
  }



Server::Server(QObject* parent): QObject(parent)
{
TDataMode Mode = dmNone;
    i = 0;
    BufSize = 0;
    //QMessageBox msgBox;
    const QString filename = "D:\\Contacts.txt";
    filetxt.setFileName(filename);
    filetxt.open(QIODevice::WriteOnly | QIODevice::Text);
    if(!filetxt.isOpen()){
            qDebug() << "- Error, unable to open" << "outputFilename" << "for output";
        }


    i = 0;


    WAV_HEADER wav_hdr;

    strncpy( wav_hdr.RIFF, "RIFF", 4 );

     wav_hdr.ChunkSize = 36 + 655360;

     strncpy( wav_hdr.WAVE, "WAVE", 4 );

     strncpy( wav_hdr.fmt, "fmt ", 4 );

     wav_hdr.Subchunk1Size = 16;
     wav_hdr.AudioFormat = 1;
     wav_hdr.NumOfChan = 1;
     wav_hdr.SamplesPerSec = 44100;
     wav_hdr.bytesPerSec = 44100 * 1 * 2;
     wav_hdr.blockAlign = 2;
     wav_hdr.bitsPerSample = 16;

     strncpy( wav_hdr.Subchunk2ID, "data", 4 );

     wav_hdr.Subchunk2Size = 655360;

     writeJpg = fopen("D:\\photo.jpg", "wb");

     if(writeJpg==NULL)
     {
        qDebug()<<"Ошибка откртия файла";
                       }

    filesound = fopen("D:\\test.wav", "wb");
       if(filesound==NULL)
       {
          qDebug()<<"Ошибка откртия файла";
                         }

       int sz = fwrite(&wav_hdr, 1,sizeof (wav_hdr), filesound);



  connect(&server, SIGNAL(newConnection()),
    this, SLOT(acceptConnection()));

  server.listen(QHostAddress::Any, 8888);

  qDebug() << "listen ok";
}

Server::~Server()
{
   fclose(filesound);
   filetxt.close();
  server.close();
}

void Server::acceptConnection()
{

  client = server.nextPendingConnection();
  //vec.push_back(client);

  int descript = client->socketDescriptor();

    SClients[descript]=client;
  connect(SClients[descript], SIGNAL(readyRead()),
      this, SLOT(startRead()));
    connect(SClients[descript], SIGNAL(disconnected()), SClients[descript]
, SLOT(deleteLater()));

   // SClients[descript]->write("Yes excellent connection plus five");
   // SClients[descript]->disconnectFromHost();

    qDebug() << "Accept ok\n";
     qDebug() << descript << "\n";
    //qDebug() << i << "\n";
  /*connect(client, SIGNAL(readyRead()),
    this, SLOT(startRead()));*/
  //connect(client, SIGNAL(disconnected()), client, SLOT(deleteLater()));
 // qDebug() << "Accept ok";



}

void Server::startRead()
{
QTcpSocket *clientSocket = (QTcpSocket*)sender();
QByteArray bytes1;


 //QByteArray Data = clientSocket->readAll();
 //qDebug() <<   " Data is: "<< Data;
// double s = 1;
 //bytes = clientSocket->readAll();
//clientSocket ->read(buf,clientSocket->bytesAvailable());
//QDataStream os( bytes );
//char *p = (char*) &d;

//for (i = 0; i < sizeof(double); i++)
 // p = buf;
//os >> s;
//qDebug() << d;
 //bytes = clientSocket->readAll();
       //clientSocket->write("Yes excellent connection");

        //clientSocket->disconnectFromHost();

//qDebug() << ESC;
//qDebug() << Mode;
//qDebug() << Size;
   bool End;
   int j = 0;

QByteArray bytes = clientSocket->readAll();
 //int sizebytes = bytes.length();

   QString CurrentText="";

   //qDebug() << bytes.length() << bytes.size();
int nSize = bytes.length();
qDebug() << bytes.length() << nSize;
char Buffer [nSize];
memcpy(Buffer, bytes.data(), nSize);

qDebug() << Buffer;
char* BufPtr = Buffer;
char *BufferEnd = BufPtr + nSize;
qDebug() << bytes.length() << nSize;

   while ( BufPtr < BufferEnd )
   {
   char *TextPtr;

   switch (Mode)
   {
   case dmText:
      TextPtr = BufPtr;
      while (*BufPtr != ETX && BufPtr < BufferEnd)
    {
         // j++;
          BufPtr++;
      }
      End = *BufPtr == ETX;
     *BufPtr=0;
      CurrentText += TextPtr;
       qDebug() << CurrentText;
      if (End)
      {
          qDebug() << CurrentText;
          if(filetxt.isOpen())
          {
              QTextStream outStream(&filetxt);
              outStream << CurrentText;
          }
          CurrentText="";
          Mode=dmNone;


      }



     // qDebug() << CurrentText;
       break;

   case dmBinary:


// qDebug() << "HereBin";

        if(i == 0)
        {
            bytes1[0] = bytes[1];
            bytes1[1] = bytes[2];
            bytes1[2] = bytes[3];
            bytes1[3] = bytes[4];
            int blockSize = byteArrayToInt(bytes1);
            sizeBin = blockSize;
             qDebug() << sizeBin;
             i++;
             bytes.remove(0, 5);

             qDebug() << nSize;

             nSize = nSize - 5;
             BufferEnd -= 5;


        }


//while ( j < bytes.length() && BufSize != sizeBin ) //j++;
  //while ( BufPtr < BufferEnd && BufSize != sizeBin )
 while ( j < nSize && BufSize != sizeBin )
{


 //siz =  fwrite(bytes,bytes.length(),1,writeJpg);
                 siz =  fwrite(bytes,nSize,1,writeJpg);
     //siz =  fwrite(bytes,1,1,writeJpg);
     qDebug() << siz;

//BufSize += bytes.length();
//j += bytes.length();
//qDebug() << bytes.length() << nSize;
 BufSize += nSize;
 j += nSize;
 BufPtr += nSize;
 //BufSize += nSize;
//j++;
//BufPtr ++;
//BufSize++;
qDebug() << j << BufSize;

 End = BufSize == sizeBin;

if (End)
{

    if(writeJpg != NULL )
     {
        qDebug() << "Size has been reached";
       // int sz =  fwrite(bytes,nSize,1,writeJpg);


    Mode=dmNone;
qDebug() << BufSize;

  }

}
 }
//Mode=dmNone;
       break;



   case dmNone:



     qDebug() << "The End";

       switch (*BufPtr){

       case STX:

      Mode=dmText;
 qDebug() << "HelloText";
       break;

       case  ESC:

           Mode=dmBinary;

 qDebug() << "HelloBin";
          // BufPtr++;
       break;


       default:
    qDebug() << "Unknown";
      break;
   }

BufPtr++;
qDebug() << "Increment";
}
   }





}
 
Записан
yura91
Гость
« Ответ #1 : Июнь 09, 2016, 18:01 »

Щас приложу другой скрин на этом не видно.
Записан
yura91
Гость
« Ответ #2 : Июнь 09, 2016, 18:04 »

Просто у меня на изображении черная полоса снизу отображается. На скринах почему то не видно, но если скачать файл будет видно(внизу - черная полоса). Ну суть в том что если даже по одному байту все писать то получается поврежденный файл
« Последнее редактирование: Июнь 09, 2016, 18:17 от yura91 » Записан
yura91
Гость
« Ответ #3 : Июнь 09, 2016, 18:16 »

То есть если в коде вместо siz =  fwrite(bytes,nSize,1,writeJpg); поставить siz =  fwrite(bytes,1,1,writeJpg); то jpg файл вообще получается поврежденный, хотя размер файла после siz =  fwrite(bytes,nSize,1,writeJpg); как и после siz =  fwrite(bytes,1,1,writeJpg); равен одному и тому же числу 36864 байт. Подскажите как исправить код, чтобы все записывалось в файл нормально??
Записан
yodu
Гость
« Ответ #4 : Июнь 13, 2016, 13:50 »

Кшмар.

Что за треш в коде? для начала попробуй просто открыть один файл и переписать его содержимое в другой. А то у тебя в коде какая-то магия странная.

Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.052 секунд. Запросов: 21.