CommonFunction.hpp 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. #pragma once
  2. #include <megopp/endian/net.h>
  3. #include <iostream>
  4. #include <sstream>
  5. #include <fstream>
  6. #include <iomanip>
  7. #define NOMINMAX // max()无法识别问题是由于与 Windows.h 头文件中的宏定义产生了冲突而导致的编译错误。
  8. #include "ghc/filesystem.hpp"
  9. #include <memepp/native.hpp>
  10. #include <nlohmann/json.hpp>
  11. #include <vector>
  12. using json = nlohmann::json;
  13. namespace fs = ghc::filesystem;
  14. #define Debug_Print_Error(x) cerr << "(Error in" << __FILE__ << ":" << __LINE__ << ",funtion" << __FUNCTION__ << ")-" << x<< endl;
  15. #define Debug_Print_Info(x) cerr << __FILE__ << ":" << __LINE__ << ",funtion" << __FUNCTION__ << ")-" << x<< endl;
  16. static std::string HexArrayToString(const uint8_t *hexArray,const size_t arrayLen)
  17. {
  18. std::ostringstream oss;
  19. for (int i = 0;i < arrayLen;++i)
  20. {
  21. oss << std::hex << std::setw(2) << std::setfill('0') << static_cast<int>(hexArray[i]) << " ";
  22. }
  23. std::string formattedHexString = oss.str();
  24. return formattedHexString;
  25. }
  26. template<typename _Ty>
  27. inline void WriteDataToBufferWithNetworkByteOrder(_Ty data, uint8_t* buffer)
  28. {
  29. #if MEGO_ENDIAN__LITTLE_BYTE
  30. data = megopp::endian::byte_swap(data);
  31. #elif MEGO_ENDIAN__BIG_BYTE
  32. // nothing
  33. #else
  34. #error "unknown endian"
  35. #endif
  36. memcpy(buffer, &data, sizeof(data));
  37. }
  38. static bool directoryExists(const std::string& path) {
  39. return fs::exists(path) && fs::is_directory(path);
  40. }
  41. static uint64_t getNow() {
  42. const auto current_time = std::chrono::system_clock::now().time_since_epoch();
  43. auto now = std::chrono::duration_cast<std::chrono::milliseconds>(current_time).count();
  44. return now;
  45. }
  46. static std::string getRunDir() {
  47. fs::path currentPath = fs::current_path();
  48. return currentPath.string();
  49. }
  50. static memepp::native_string getAppDir(memepp::native_string& input) {
  51. #if MG_OS__WIN_AVAIL
  52. size_t end = input.find(L"line_store");
  53. #else
  54. size_t end = input.find("line_store");
  55. #endif
  56. if (end != std::string::npos) {
  57. return input.substr(0, end);
  58. }
  59. else {
  60. return input;
  61. }
  62. }
  63. static json parseLog(const std::string& log) {
  64. json logJson;
  65. // 寻找方括号的位置
  66. size_t bracket1 = log.find('[');
  67. size_t bracket2 = log.find(']', bracket1 + 1);
  68. size_t bracket3 = log.find('[', bracket2 + 1);
  69. size_t bracket4 = log.find(']', bracket3 + 1);
  70. size_t bracket5 = log.find('[', bracket4 + 1);
  71. size_t bracket6 = log.find(']', bracket5 + 1);
  72. size_t bracket7 = log.find('[', bracket6 + 1);
  73. size_t bracket8 = log.find(']', bracket7 + 1);
  74. if (bracket1 != std::string::npos &&
  75. bracket2 != std::string::npos &&
  76. bracket3 != std::string::npos &&
  77. bracket4 != std::string::npos &&
  78. bracket5 != std::string::npos &&
  79. bracket6 != std::string::npos &&
  80. bracket7 != std::string::npos &&
  81. bracket8 != std::string::npos
  82. ) {
  83. // 提取时间、级别、服务名、消息
  84. std::string timestampStr = log.substr(bracket1 + 1, bracket2 - bracket1 - 1);
  85. std::string level = log.substr(bracket5 + 1, bracket6 - bracket5 - 1);
  86. std::string category = log.substr(bracket7 + 1, bracket8 - bracket7 - 1);
  87. std::string message = log.substr(bracket8 + 1);
  88. // 转换时间戳字符串为 int64
  89. std::tm tm = {};
  90. std::istringstream timestampStream(timestampStr);
  91. timestampStream >> std::get_time(&tm, "%Y-%m-%d %H:%M:%S");
  92. std::time_t timestamp = std::mktime(&tm);
  93. // 构建 JSON 结构
  94. logJson["ts"] = static_cast<int64_t>(timestamp)*1000;
  95. logJson["level"] = level;
  96. logJson["mainSrvName"] = "gateway";
  97. logJson["subSrvName"] = category;
  98. logJson["msg"] = message;
  99. return logJson;
  100. }
  101. // 如果解析失败,返回空的 JSON 对象
  102. return {};
  103. }
  104. static uint64_t get_timestamp_from_vec(const uint8_t* szData,const size_t size)
  105. {
  106. uint64_t timestamp = 0;
  107. if (size > 30)
  108. {
  109. if (szData[0] == 0x00)
  110. {
  111. for (int i = 0; i < 8; i++) {
  112. timestamp = (timestamp << 8) + szData[5 + i];
  113. }
  114. }
  115. else if (szData[0] == 0x01)
  116. {
  117. for (int i = 0; i < 8; i++) {
  118. timestamp = (timestamp << 8) + szData[11 + i];
  119. }
  120. }
  121. }
  122. return timestamp;
  123. }
  124. // 去掉字符串中的"${}"部分
  125. static std::string removeBraces(const std::string& input) {
  126. std::string result;
  127. size_t startPos = 0;
  128. size_t foundPos = input.find("${", startPos); // 查找"${"的位置
  129. while (foundPos != std::string::npos) {
  130. // 将"${"之前的部分拼接到结果中
  131. result += input.substr(startPos, foundPos - startPos);
  132. // 更新起始位置,跳过"${"
  133. startPos = foundPos + 2;
  134. // 查找下一个"${"的位置
  135. foundPos = input.find("${", startPos);
  136. }
  137. // 将最后一个"${"之后的部分拼接到结果中
  138. result += input.substr(startPos);
  139. // 移除剩余的"}"
  140. size_t closePos;
  141. while ((closePos = result.find("}", startPos)) != std::string::npos) {
  142. result.erase(closePos, 1);
  143. }
  144. return result;
  145. }
  146. //获取%{}中的数值
  147. static std::vector<std::string> extractValueFromExpression(const std::string& expression)
  148. {
  149. std::vector<std::string> values;
  150. size_t startPos = expression.find("%{");
  151. while (startPos != std::string::npos)
  152. {
  153. size_t endPos = expression.find("}", startPos + 2);
  154. if (endPos != std::string::npos) {
  155. std::string numberStr = expression.substr(startPos + 2, endPos - startPos - 2);
  156. values.push_back(numberStr);
  157. startPos = expression.find("%{", endPos);
  158. }
  159. else
  160. {
  161. break;
  162. }
  163. }
  164. return values;
  165. }
  166. //把字符串中 %{point}替换成 'id'
  167. //av: = avg(getLastValue(% { 10001 }), getVal(% { 10001 }));
  168. //switch to:av: = avg(getLastValue('id1'), getVal('id1'));
  169. static std::string replacePlaceholder(const std::string& expression, const std::vector<std::string>& replacements)
  170. {
  171. std::string result = expression;
  172. size_t startPos = result.find("%{");
  173. size_t replaceIndex = 0;
  174. while (startPos != std::string::npos && replaceIndex < replacements.size())
  175. {
  176. size_t endPos = result.find("}", startPos + 2);
  177. if (endPos != std::string::npos) {
  178. std::string replacement = replacements[replaceIndex];
  179. // 将替换内容添加 getVal( )
  180. std::string replacementWithGetVal = "'" + replacement + "'";
  181. // 替换 %{x} 成 getVal(x)
  182. result.replace(startPos, endPos - startPos + 1, replacementWithGetVal);
  183. // 更新 startPos
  184. startPos = result.find("%{", startPos + replacementWithGetVal.length());
  185. replaceIndex++;
  186. }
  187. else
  188. {
  189. break;
  190. }
  191. }
  192. return result;
  193. }