Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

StringUtils.cpp 3.5KB

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