SD carta запись в файл. Лишние символы.

forzub
Offline
Зарегистрирован: 11.07.2019

Добрый день. Прошу помощи форума. 
Есть процедура, на которую подаются данные из буфера [byte* bufptr,int *lens], длина буфера. Эти данные сохраняются в глобальную переменную [parseserver]. Эта переменная проверяется на наличие ключа [HTTP.boundary], который находится в конце сообщения. если ключ не найден, проверяется длина строки. если она больше длинны ключа, то разница записывается в файл. после записи файл закрывается и работа прекращается. Сделал в конце проверку:

parseserver-stp4=>>size:12px;}
 
<<= - строка в глобальной переменной - то, что будет записано в файл последним.
parseserver-len=>>17<<=  - количество символов которое должно быть записано
close file
 
но в конце файла все время дописываются какие-то остатки из предыдущих итераций:
.ufuter a:link, .ufuter a:visited, .ufuter a:hover {color:#ccc; text-decoration:none; z-index:5;}
.clear{clear:both;}
.ufcopy{padding:0; font-size:12px;}:none; z-index:5;}
.clea
 
грешил на отсутствие нуля в конце строки, но согласно проверке - все должно быть правильно. после последней записи файл закрывается.
 
Подскажите, может кто-то сталкивался с такой проблемой, как ее решить?
void http_handleFileUpload(byte* bufptr,int *lens){
 
      if(HTTP.upload_status == UPLOAD_FILE_START){
        Serial.println("create file");
        if(SD.exists(HTTP.filename)) SD.remove(HTTP.filename);
        HTTP.uploadFile = SD.open(HTTP.filename, FILE_WRITE);
        HTTP.upload_status == UPLOAD_FILE_NONE;
      }

      int size1 = strlen(parseserver) + *lens;
      strcat(parseserver,(char*)bufptr);
      parseserver[size1] = NULL;

      char* point_end = strstr(parseserver,HTTP.boundary);
      if(point_end != NULL){
        parseserver[point_end - parseserver - 4] = '\0';
        strcpy(parseserver,parseserver);
        
         HTTP.upload_status = UPLOAD_FILE_END;
      }else{
        HTTP.upload_status = UPLOAD_FILE_WRITE;
        }
      if(strlen(parseserver) > (strlen(HTTP.boundary) + 2)){

        if(HTTP.upload_status != UPLOAD_FILE_END) HTTP.upload_status = UPLOAD_FILE_WRITE;
      }else{
        if(HTTP.upload_status != UPLOAD_FILE_END) HTTP.upload_status = UPLOAD_FILE_NONE;
      }
       if((HTTP.upload_status == UPLOAD_FILE_WRITE) & (HTTP.uploadFile)){
        HTTP.uploadFile.write(parseserver, size1);
        strcpy(parseserver,parseserver + size1);
          }
      if(HTTP.upload_status == UPLOAD_FILE_END){
        HTTP.uploadFile.write(parseserver, strlen(parseserver));
        Serial.println();Serial.print("parseserver-stp4=>>"); Serial.print(parseserver);Serial.println("<<=");
        Serial.println();Serial.print("parseserver-len=>>"); Serial.print(strlen(parseserver));Serial.println("<<=");
        if(HTTP.uploadFile) HTTP.uploadFile.close();
        HTTP.reading_body=false;
        http_returnOK();    
      }
}

 

rkit
Offline
Зарегистрирован: 23.11.2016

С чего ты решил, что в byte* будет терминатор строки?

b707
Онлайн
Зарегистрирован: 26.05.2017

в строке 16. как мне кажется, знак перепутан.

И что делает строка 17 - копирует parsesserver сам в себя? в чем смысл этой операции?

forzub
Offline
Зарегистрирован: 11.07.2019

не совсем понимаю вопрос.

это попытка парсить POST запрос с телом файла. на вход подается содержимое буфера ethernet.

оно конечно может быть и не строковым, но ключи будут - строки.

forzub
Offline
Зарегистрирован: 11.07.2019

вроде правильно. перед ключом будет "\r\n\r\n", поэтому отрезаю ключ и еще 4 символа. проверка вроде подтверждает. 17 строка... наверное, что-то на ум пошло, надо убрать. но не думаю, что она мешает ))

forzub
Offline
Зарегистрирован: 11.07.2019

нашел. ошибка была не в записи, а в чтении. спасибо :)

sadman41
Offline
Зарегистрирован: 19.10.2016

А Вы думаете, что есть какая-то утвержденная XX съездом компартии реализация функции write() , за правильным применением которой следят те самые органы?

Я, к примеру, не представляю откуда у Вас взялся объект HTTP и что у него внутре. Может Вы его на дороге нашли и он радиоактивный.