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 и что у него внутре. Может Вы его на дороге нашли и он радиоактивный.