SD carta запись в файл. Лишние символы.
- Войдите на сайт для отправки комментариев
Чт, 24/06/2021 - 18:26
Добрый день. Прошу помощи форума.
Есть процедура, на которую подаются данные из буфера [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(); } }
С чего ты решил, что в byte* будет терминатор строки?
в строке 16. как мне кажется, знак перепутан.
И что делает строка 17 - копирует parsesserver сам в себя? в чем смысл этой операции?
не совсем понимаю вопрос.
это попытка парсить POST запрос с телом файла. на вход подается содержимое буфера ethernet.
оно конечно может быть и не строковым, но ключи будут - строки.
вроде правильно. перед ключом будет "\r\n\r\n", поэтому отрезаю ключ и еще 4 символа. проверка вроде подтверждает. 17 строка... наверное, что-то на ум пошло, надо убрать. но не думаю, что она мешает ))
нашел. ошибка была не в записи, а в чтении. спасибо :)
А Вы думаете, что есть какая-то утвержденная XX съездом компартии реализация функции write() , за правильным применением которой следят те самые органы?
Я, к примеру, не представляю откуда у Вас взялся объект HTTP и что у него внутре. Может Вы его на дороге нашли и он радиоактивный.