You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

StringUtils.cpp 3.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. //
  2. // Created by robin on 6/20/16.
  3. //
  4. #include <algorithm>
  5. #include "libnfc_cpptools/StringUtils.h"
  6. namespace LibNfc
  7. {
  8. namespace Utils
  9. {
  10. const std::string StringUtils::hex = "0123456789abcdef";
  11. std::string StringUtils::rawToHuman(uint8_t c)
  12. {
  13. return std::string(1, hex[c >> 4]) + std::string(1, hex[c & 0x0f]);
  14. }
  15. std::string StringUtils::rawToHuman(int8_t c)
  16. {
  17. return rawToHuman((uint8_t) c);
  18. }
  19. std::string StringUtils::rawToHuman(uint16_t c)
  20. {
  21. return rawToHuman((uint8_t) (c >> 8)) + rawToHuman((uint8_t) c);
  22. }
  23. std::string StringUtils::rawToHuman(int16_t c)
  24. {
  25. return rawToHuman((uint16_t) c);
  26. }
  27. std::string StringUtils::rawToHuman(uint32_t c)
  28. {
  29. return rawToHuman((uint16_t) (c >> 16)) + rawToHuman((uint16_t) c);
  30. }
  31. std::string StringUtils::rawToHuman(int32_t c)
  32. {
  33. return rawToHuman((uint32_t) c);
  34. }
  35. std::string StringUtils::rawToHuman(uint64_t c)
  36. {
  37. return rawToHuman((uint32_t) (c >> 32)) + rawToHuman((uint32_t) c);
  38. }
  39. std::string StringUtils::rawToHuman(int64_t c)
  40. {
  41. return rawToHuman((uint64_t) c);
  42. }
  43. std::string StringUtils::rawToHuman(const std::string &raw)
  44. {
  45. std::string human;
  46. for (size_t i = 0; i < raw.size(); ++i)
  47. {
  48. human += rawToHuman((int8_t) raw[i]);
  49. }
  50. return human;
  51. }
  52. ResultString StringUtils::humanToRaw(const std::string &human)
  53. {
  54. if (human.size() % 2 != 0)
  55. {
  56. return ResultString::error("Malformed hex data: invalid length");
  57. }
  58. std::string raw;
  59. for (size_t i = 0; i < human.size(); i += 2)
  60. {
  61. char c1 = toLower(human[i]);
  62. char c2 = toLower(human[i + 1]);
  63. size_t i1 = hex.find(c1);
  64. size_t i2 = hex.find(c2);
  65. if (i1 == std::string::npos || i2 == std::string::npos)
  66. {
  67. return ResultString::error("Malformed hex data at char " + std::to_string(i));
  68. }
  69. raw += std::string(1, (char) ((i1 << 4) + i2));
  70. }
  71. return ResultString::ok(raw);
  72. }
  73. std::string StringUtils::toLower(const std::string &str)
  74. {
  75. std::string lower;
  76. for (size_t i = 0; i < str.size(); ++i)
  77. {
  78. lower += tolower(str[i]);
  79. }
  80. return lower;
  81. }
  82. char StringUtils::toLower(char c)
  83. {
  84. if (c >= 'A' && c <= 'Z')
  85. {
  86. return c + ('a' - 'A');
  87. }
  88. return c;
  89. }
  90. std::string StringUtils::toUpper(const std::string &str)
  91. {
  92. std::string upper;
  93. for (size_t i = 0; i < str.size(); ++i)
  94. {
  95. upper += toUpper(str[i]);
  96. }
  97. return upper;
  98. }
  99. char StringUtils::toUpper(char c)
  100. {
  101. if (c >= 'a' && c <= 'z')
  102. {
  103. return c - ('a' - 'A');
  104. }
  105. return c;
  106. }
  107. std::string StringUtils::ensureSize(const std::string &data, int size)
  108. {
  109. if (data.size() == size)
  110. {
  111. return data;
  112. } else if (data.size() > size)
  113. {
  114. return data.substr(0, size);
  115. } else
  116. {
  117. return data + std::string(size - data.size(), '\0');
  118. }
  119. }
  120. std::string StringUtils::ltrim(const std::string &s)
  121. {
  122. std::string data = s;
  123. data.erase(data.begin(), std::find_if(data.begin(), data.end(),
  124. std::not1(std::ptr_fun<int, int>(std::isspace))));
  125. return data;
  126. }
  127. std::string StringUtils::rtrim(const std::string &s)
  128. {
  129. std::string data = s;
  130. data.erase(std::find_if(data.rbegin(), data.rend(),
  131. std::not1(std::ptr_fun<int, int>(std::isspace))).base(), data.end());
  132. return data;
  133. }
  134. std::string StringUtils::trim(const std::string &s)
  135. {
  136. return ltrim(rtrim(s));
  137. }
  138. std::string StringUtils::removeSpaces(const std::string &s)
  139. {
  140. std::string data = s;
  141. data.erase(std::remove_if(data.begin(), data.end(), std::ptr_fun<int, int>(std::isspace)), data.end());
  142. return data;
  143. }
  144. }; // Utils
  145. }; // LibNfc