17 return str.length() >
length ? str.substr(0,
length) : str;
21 const char *
pos = strchr(str, ch);
22 return pos ==
nullptr ? std::string(str) : std::string(str,
pos - str);
24std::string
str_until(
const std::string &str,
char ch) {
return str.substr(0, str.find(ch)); }
30 result.resize(str.length());
31 std::transform(str.begin(), str.end(), result.begin(), [](
unsigned char ch) { return fn(ch); });
38 result.resize(str.length());
39 std::transform(str.begin(), str.end(), result.begin(), [](
unsigned char ch) { return std::toupper(ch); });
44 std::string result = str;
45 for (
char &c : result) {
53 result.resize(str.size());
64 size_t out_length = vsnprintf(&str[0],
len + 1,
fmt,
args);
68 str.resize(out_length);
92 char buf[VALUE_ACCURACY_MAX_LEN];
94 return std::string(buf);
99static constexpr const char *BASE64_CHARS =
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
100 "abcdefghijklmnopqrstuvwxyz"
104static inline void base64_encode_triple(
const char *char_array_3,
int count, std::string &ret) {
105 char char_array_4[4];
106 char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
107 char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
108 char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
109 char_array_4[3] = char_array_3[2] & 0x3f;
111 for (
int j = 0; j < count; j++)
112 ret += BASE64_CHARS[
static_cast<uint8_t
>(char_array_4[j])];
120 char char_array_3[3];
123 char_array_3[i++] = *(buf++);
125 base64_encode_triple(char_array_3, 4, ret);
131 for (
int j = i; j < 3; j++)
132 char_array_3[j] =
'\0';
134 base64_encode_triple(char_array_3, i + 1, ret);
145 size_t max_len = ((encoded_string.size() + 3) / 4) * 3;
146 std::vector<uint8_t> ret(max_len);
147 size_t actual_len =
base64_decode(encoded_string, ret.data(), max_len);
148 ret.resize(actual_len);
157 return std::string(buf);
170static std::string format_hex_pretty_uint8(
const uint8_t *data,
size_t length,
char separator,
bool show_length) {
171 if (data ==
nullptr ||
length == 0)
174 size_t hex_len = separator ? (
length * 3 - 1) : (
length * 2);
177 if (show_length &&
length > 4)
178 return ret +
" (" + std::to_string(
length) +
")";
183 return format_hex_pretty_uint8(data,
length, separator, show_length);
185std::string
format_hex_pretty(
const std::vector<uint8_t> &data,
char separator,
bool show_length) {
190 if (data ==
nullptr ||
length == 0)
193 size_t hex_len = separator ? (
length * 5 - 1) : (
length * 4);
196 if (show_length &&
length > 4)
197 return ret +
" (" + std::to_string(
length) +
")";
200std::string
format_hex_pretty(
const std::vector<uint16_t> &data,
char separator,
bool show_length) {
204 return format_hex_pretty_uint8(
reinterpret_cast<const uint8_t *
>(data.data()), data.length(), separator, show_length);
209 result.resize(
length * 8);
221 return std::string(buf);
225 char buf[MAC_ADDRESS_PRETTY_BUFFER_SIZE];
Heap-allocating helper functions.
std::string value_accuracy_to_string(float value, int8_t accuracy_decimals)
void format_mac_addr_lower_no_sep(const uint8_t *mac, char *output)
Format MAC address as xxxxxxxxxxxxxx (lowercase, no separators)
std::string format_hex(const uint8_t *data, size_t length)
Format the byte array data of length len in lowercased hex.
size_t value_accuracy_to_buf(std::span< char, VALUE_ACCURACY_MAX_LEN > buf, float value, int8_t accuracy_decimals)
Format value with accuracy to buffer, returns chars written (excluding null)
std::string str_lower_case(const std::string &str)
Convert the string to lower case.
const char int const __FlashStringHelper va_list args
std::string format_bin(const uint8_t *data, size_t length)
Format the byte array data of length len in binary.
std::string str_sanitize(const std::string &str)
Sanitizes the input string by removing all characters but alphanumerics, dashes and underscores.
std::vector< uint8_t > base64_decode(const std::string &encoded_string)
Decode a base64 string to a byte vector.
char * format_hex_pretty_to(char *buffer, size_t buffer_size, const uint8_t *data, size_t length, char separator)
Format byte array as uppercase hex to buffer (base implementation).
std::string get_mac_address_pretty()
Get the device MAC address as a string, in colon-separated uppercase hex notation.
std::string str_snprintf(const char *fmt, size_t len,...)
const char * get_mac_address_pretty_into_buffer(std::span< char, MAC_ADDRESS_PRETTY_BUFFER_SIZE > buf)
Get the device MAC address into the given buffer, in colon-separated uppercase hex notation.
std::string str_upper_case(const std::string &str)
Convert the string to upper case.
std::string format_hex_pretty(const uint8_t *data, size_t length, char separator, bool show_length)
Format a byte array in pretty-printed, human-readable hex format.
std::string str_until(const char *str, char ch)
Extract the part of the string until either the first occurrence of the specified character,...
char * str_sanitize_to(char *buffer, size_t buffer_size, const char *str)
Sanitize a string to buffer, keeping only alphanumerics, dashes, and underscores.
std::string format_mac_address_pretty(const uint8_t *mac)
std::string base64_encode(const std::vector< uint8_t > &buf)
Encode a byte vector to base64 string.
std::string str_sprintf(const char *fmt,...)
size_t size_t const char va_start(args, fmt)
void get_mac_address_raw(uint8_t *mac)
Get the device MAC address as raw bytes, written into the provided byte array (6 bytes).
size_t size_t const char * fmt
std::string get_mac_address()
Get the device MAC address as a string, in lowercase hex notation.
constexpr char to_snake_case_char(char c)
Convert a single char to snake_case: lowercase and space to underscore.
char * format_hex_to(char *buffer, size_t buffer_size, const uint8_t *data, size_t length)
Format byte array as lowercase hex to buffer (base implementation).
std::string str_snake_case(const std::string &str)
Convert the string to snake case (lowercase with underscores).
std::string str_ctype_transform(const std::string &str)
char * format_bin_to(char *buffer, size_t buffer_size, const uint8_t *data, size_t length)
Format byte array as binary string to buffer.
char * format_mac_addr_upper(const uint8_t *mac, char *output)
Format MAC address as XX:XX:XX:XX:XX:XX (uppercase, colon separators)
std::string str_truncate(const std::string &str, size_t length)
Truncate a string to a specific length.