+void FillFileNameByUID(char *fileName, uint8_t *uid, char *ext, int byteCount) {
+ char * fnameptr = fileName;
+
+ for (int j = 0; j < byteCount; j++, fnameptr += 2)
+ sprintf(fnameptr, "%02x", (unsigned int) uid[j]);
+ sprintf(fnameptr, "%s", ext);
+}
+
+// fill buffer from structure [{uint8_t data, size_t length},...]
+int FillBuffer(uint8_t *data, size_t maxDataLength, size_t *dataLength, ...) {
+ *dataLength = 0;
+ va_list valist;
+ va_start(valist, dataLength);
+
+ uint8_t *vdata = NULL;
+ size_t vlength = 0;
+ do{
+ vdata = va_arg(valist, uint8_t *);
+ if (!vdata)
+ break;
+
+ vlength = va_arg(valist, size_t);
+ if (*dataLength + vlength > maxDataLength) {
+ va_end(valist);
+ return 1;
+ }
+
+ memcpy(&data[*dataLength], vdata, vlength);
+ *dataLength += vlength;
+
+ } while (vdata);
+
+ va_end(valist);
+
+ return 0;
+}
+
+bool CheckStringIsHEXValue(const char *value) {
+ for (int i = 0; i < strlen(value); i++)
+ if (!isxdigit(value[i]))
+ return false;
+
+ if (strlen(value) % 2)
+ return false;
+
+ return true;
+}
+
+void hex_to_buffer(const uint8_t *buf, const uint8_t *hex_data, const size_t hex_len, const size_t hex_max_len,
+ const size_t min_str_len, const size_t spaces_between, bool uppercase) {
+
+ char *tmp = (char *)buf;
+
+ int maxLen = (hex_len > hex_max_len) ? hex_max_len : hex_len;
+
+ for (int i = 0; i < maxLen; ++i, tmp += 2 + spaces_between) {
+ sprintf(tmp, (uppercase) ? "%02X" : "%02x", (unsigned int) hex_data[i]);
+
+ if (i != maxLen - 1)
+ for (int j = 0; j < spaces_between; j++)
+ sprintf(tmp + 2 + j, " ");
+ }
+
+ size_t len = strlen(tmp);
+ int minStrLen = min_str_len > len ? min_str_len : 0;
+ if (minStrLen > hex_max_len)
+ minStrLen = hex_max_len;
+ for (int i = len; i < minStrLen; i++, tmp += 1)
+ sprintf(tmp, " ");
+
+ return;
+}
+
+// printing and converting functions
+
+char *sprint_hex(const uint8_t *data, const size_t len) {
+ static char buf[4097] = {0};
+
+ hex_to_buffer((uint8_t *)buf, data, len, sizeof(buf) - 1, 0, 1, false);
+
+ return buf;
+}
+
+char *sprint_hex_inrow_ex(const uint8_t *data, const size_t len, const size_t min_str_len) {
+ static char buf[4097] = {0};
+
+ hex_to_buffer((uint8_t *)buf, data, len, sizeof(buf) - 1, min_str_len, 0, false);
+
+ return buf;
+}
+
+char *sprint_hex_inrow(const uint8_t *data, const size_t len) {
+ return sprint_hex_inrow_ex(data, len, 0);
+}
+
+char *sprint_bin_break(const uint8_t *data, const size_t len, const uint8_t breaks) {
+ // make sure we don't go beyond our char array memory
+ int max_len;
+ if (breaks==0)
+ max_len = ( len > MAX_BIN_BREAK_LENGTH ) ? MAX_BIN_BREAK_LENGTH : len;
+ else
+ max_len = ( len+(len/breaks) > MAX_BIN_BREAK_LENGTH ) ? MAX_BIN_BREAK_LENGTH : len+(len/breaks);
+
+ static char buf[MAX_BIN_BREAK_LENGTH]; // 3072 + end of line characters if broken at 8 bits
+ //clear memory
+ memset(buf, 0x00, sizeof(buf));
+ char *tmp = buf;
+
+ size_t in_index = 0;
+ // loop through the out_index to make sure we don't go too far
+ for (size_t out_index=0; out_index < max_len; out_index++) {
+ // set character - (should be binary but verify it isn't more than 1 digit)
+ if (data[in_index]<10)
+ sprintf(tmp++, "%u", (unsigned int) data[in_index]);
+ // check if a line break is needed and we have room to print it in our array
+ if ( (breaks > 0) && !((in_index+1) % breaks) && (out_index+1 < max_len) ) {
+ // increment and print line break
+ out_index++;
+ sprintf(tmp++, "%s","\n");
+ }
+ in_index++;
+ }
+
+ return buf;
+}
+
+char *sprint_bin(const uint8_t *data, const size_t len) {
+ return sprint_bin_break(data, len, 0);
+}
+
+char *sprint_ascii_ex(const uint8_t *data, const size_t len, const size_t min_str_len) {