Название: Не корректно записываются данные в файл Отправлено: 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"; } } } Название: Re: Не корректно записываются данные в файл Отправлено: yura91 от Июнь 09, 2016, 18:01 Щас приложу другой скрин на этом не видно.
Название: Re: Не корректно записываются данные в файл Отправлено: yura91 от Июнь 09, 2016, 18:04 Просто у меня на изображении черная полоса снизу отображается. На скринах почему то не видно, но если скачать файл будет видно(внизу - черная полоса). Ну суть в том что если даже по одному байту все писать то получается поврежденный файл
Название: Re: Не корректно записываются данные в файл Отправлено: yura91 от Июнь 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 байт. Подскажите как исправить код, чтобы все записывалось в файл нормально??
Название: Re: Не корректно записываются данные в файл Отправлено: yodu от Июнь 13, 2016, 13:50 Кшмар.
Что за треш в коде? для начала попробуй просто открыть один файл и переписать его содержимое в другой. А то у тебя в коде какая-то магия странная. |