2022-02-15 11:37:31 +01:00
|
|
|
|
#include "utils/StringUtils.h"
|
2022-01-14 21:48:43 +01:00
|
|
|
|
|
2022-02-09 16:44:44 +01:00
|
|
|
|
void writeUint8tToString(uint8_t* payload, size_t length, size_t headerLenth, String& payloadStr) {
|
|
|
|
|
|
payloadStr = "";
|
|
|
|
|
|
payloadStr.reserve(length + 1);
|
|
|
|
|
|
for (size_t i = headerLenth; i < length; i++) {
|
|
|
|
|
|
payloadStr += (char)payload[i];
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-01-14 21:48:43 +01:00
|
|
|
|
String selectToMarkerLast(String str, String found) {
|
|
|
|
|
|
int p = str.lastIndexOf(found);
|
|
|
|
|
|
return str.substring(p + found.length());
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
String selectToMarker(String str, String found) {
|
|
|
|
|
|
int p = str.indexOf(found);
|
|
|
|
|
|
return str.substring(0, p);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
String extractInner(String str) {
|
|
|
|
|
|
int p1 = str.indexOf("[");
|
|
|
|
|
|
int p2 = str.indexOf("]");
|
|
|
|
|
|
return str.substring(p1 + 1, p2);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
String deleteAfterDelimiter(String str, String found) {
|
|
|
|
|
|
int p = str.indexOf(found);
|
|
|
|
|
|
return str.substring(0, p);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
String deleteBeforeDelimiter(String str, String found) {
|
|
|
|
|
|
int p = str.indexOf(found) + found.length();
|
|
|
|
|
|
return str.substring(p);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
String deleteBeforeDelimiterTo(String str, String found) {
|
|
|
|
|
|
int p = str.indexOf(found);
|
|
|
|
|
|
return str.substring(p);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
String deleteToMarkerLast(String str, String found) {
|
|
|
|
|
|
int p = str.lastIndexOf(found);
|
|
|
|
|
|
return str.substring(0, p);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
String selectToMarkerPlus(String str, String found, int plus) {
|
|
|
|
|
|
int p = str.indexOf(found);
|
|
|
|
|
|
return str.substring(0, p + plus);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
String selectFromMarkerToMarker(String str, String tofind, int number) {
|
|
|
|
|
|
if (str.indexOf(tofind) == -1) {
|
|
|
|
|
|
return "not found";
|
|
|
|
|
|
}
|
|
|
|
|
|
str += tofind; // добавим для корректного поиска
|
|
|
|
|
|
uint8_t i = 0; // Индекс перебора
|
|
|
|
|
|
do {
|
|
|
|
|
|
if (i == number) {
|
|
|
|
|
|
// если индекс совпал с позицией
|
|
|
|
|
|
return selectToMarker(str, tofind);
|
|
|
|
|
|
}
|
|
|
|
|
|
// отбросим проверенный блок до разделителя
|
|
|
|
|
|
str = deleteBeforeDelimiter(str, tofind);
|
|
|
|
|
|
i++;
|
|
|
|
|
|
} while (str.length() != 0);
|
|
|
|
|
|
|
|
|
|
|
|
return "not found";
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//преобразовываем байтовый массив в человеческий вид HEX в строке
|
|
|
|
|
|
void hex2string(byte array[], unsigned int len, char buffer[]) {
|
|
|
|
|
|
for (unsigned int i = 0; i < len; i++) {
|
|
|
|
|
|
byte nib1 = (array[i] >> 4) & 0x0F;
|
|
|
|
|
|
byte nib2 = (array[i] >> 0) & 0x0F;
|
|
|
|
|
|
buffer[i * 2 + 0] = nib1 < 0xA ? '0' + nib1 : 'A' + nib1 - 0xA;
|
|
|
|
|
|
buffer[i * 2 + 1] = nib2 < 0xA ? '0' + nib2 : 'A' + nib2 - 0xA;
|
|
|
|
|
|
}
|
|
|
|
|
|
buffer[len * 2] = '\0';
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
inline unsigned char ChartoHex(char ch) {
|
|
|
|
|
|
return ((ch >= 'A') ? (ch - 'A' + 0xA) : (ch - '0')) & 0x0F;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// str - указатель на массив символов
|
|
|
|
|
|
// bytes - выходной буфер
|
|
|
|
|
|
// функция возвращает колл-во байт
|
|
|
|
|
|
//
|
|
|
|
|
|
int string2hex(const char* str, unsigned char* bytes) {
|
|
|
|
|
|
unsigned char Hi, Lo;
|
|
|
|
|
|
|
|
|
|
|
|
int i = 0;
|
|
|
|
|
|
while ((Hi = *str++) && (Lo = *str++)) {
|
|
|
|
|
|
bytes[i++] = (ChartoHex(Hi) << 4) | ChartoHex(Lo);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return i;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
uint8_t hexStringToUint8(String hex) {
|
|
|
|
|
|
uint8_t tmp = strtol(hex.c_str(), NULL, 0);
|
|
|
|
|
|
if (tmp >= 0x00 && tmp <= 0xFF) {
|
|
|
|
|
|
return tmp;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
uint16_t hexStringToUint16(String hex) {
|
|
|
|
|
|
uint16_t tmp = strtol(hex.c_str(), NULL, 0);
|
|
|
|
|
|
if (tmp >= 0x0000 && tmp <= 0xFFFF) {
|
|
|
|
|
|
return tmp;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
size_t itemsCount2(String str, const String& separator) {
|
|
|
|
|
|
// если строки поиск нет сразу выход
|
|
|
|
|
|
if (str.indexOf(separator) == -1) {
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
// добавим для корректного поиска
|
|
|
|
|
|
str += separator;
|
|
|
|
|
|
size_t cnt = 0;
|
|
|
|
|
|
while (str.length()) {
|
|
|
|
|
|
// отбросим проверенный блок до разделителя
|
|
|
|
|
|
str = deleteBeforeDelimiter(str, separator);
|
|
|
|
|
|
cnt++;
|
|
|
|
|
|
}
|
|
|
|
|
|
return cnt;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
size_t itemsCount(String& str, const char* delim) {
|
|
|
|
|
|
size_t cnt = 0;
|
|
|
|
|
|
char* cstr = new char[str.length() + 1];
|
|
|
|
|
|
strcpy(cstr, str.c_str());
|
|
|
|
|
|
char* token;
|
|
|
|
|
|
while ((token = strtok_r(cstr, delim, &cstr))) {
|
|
|
|
|
|
cnt++;
|
|
|
|
|
|
// printf("%s\n", token);
|
|
|
|
|
|
}
|
|
|
|
|
|
delete[] cstr;
|
|
|
|
|
|
return cnt;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
char* stringToChar(String& str) {
|
|
|
|
|
|
char* mychar = new char[str.length() + 1];
|
|
|
|
|
|
strcpy(mychar, str.c_str());
|
|
|
|
|
|
return mychar;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
boolean isDigitStr(const String& str) {
|
|
|
|
|
|
for (size_t i = 0; i < str.length(); i++) {
|
|
|
|
|
|
if (!isDigit(str.charAt(i))) {
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return str.length();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
boolean isDigitDotCommaStr(const String& str) {
|
|
|
|
|
|
for (size_t i = 0; i < str.length(); i++) {
|
|
|
|
|
|
char latter = str.charAt(i);
|
|
|
|
|
|
if (!isDigit(latter) && latter != '.' && latter != '-') {
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
String prettyBytes(size_t size) {
|
|
|
|
|
|
if (size < 1024)
|
|
|
|
|
|
return String(size) + "b";
|
|
|
|
|
|
else if (size < (1024 * 1024))
|
|
|
|
|
|
return String(size / 1024.0) + "kB";
|
|
|
|
|
|
else if (size < (1024 * 1024 * 1024))
|
|
|
|
|
|
return String(size / 1024.0 / 1024.0) + "MB";
|
|
|
|
|
|
else
|
|
|
|
|
|
return String(size / 1024.0 / 1024.0 / 1024.0) + "GB";
|
|
|
|
|
|
}
|