#pragma once #include #include #include #include #include #include "squirrel.h" class Tool { private: /* data */ public: Tool(/* args */); ~Tool(); // 将int 转为小端序列 static unsigned char *IntToByteLittle(int Count); // 将小端序列 转为int static int ByteLittleToInt(unsigned char *Count); // 将字符串转为 数组 static unsigned char *StringToByte(std::string str); public: // 错误输出 static void Error(std::string E); // 警告输出 static void Warring(std::string W); // 常规输出 static void Logger(std::string L); //分割字符串 static void Split(const std::string &src, std::vector &dest, const std::string &separator); // 获取当前时间戳 static long long get_cur_time(); static int UTF8ToGB2312(char *szSrc, size_t iSrcLen, char *szDst, size_t iDstLen); static int GB2312ToUTF8(char *szSrc, size_t iSrcLen, char *szDst, size_t iDstLen); // 输出字节数组 static void printUint8Array(uint8_t *array, size_t length) { for (size_t i = 0; i < length; ++i) { std::cout << static_cast(array[i]); if (i != length - 1) { std::cout << ", "; // 添加逗号分隔符 } } std::cout << std::endl; } // 批量替换字符串中文本 static std::string &ReplaceAll(std::string &str, const std::string &src, const std::string &dst) { std::string::size_type pos(0); while (true) { if ((pos = str.find(src)) != std::string::npos) { str.replace(pos, src.length(), dst); } else { break; } } return str; } // 遍历指定文件夹下的所有文件,不包括指定文件夹内的文件夹 static std::vector GetListFiles(const std::string &path, const std::string &exten = "*") { std::vector list; list.clear(); DIR *dp = NULL; struct dirent *dirp = NULL; if ((dp = opendir(path.c_str())) == NULL) { return list; } while ((dirp = readdir(dp)) != NULL) { if (dirp->d_type == DT_REG) { if (exten.compare("*") == 0) list.emplace_back(static_cast(dirp->d_name)); else if (std::string(dirp->d_name).find(exten) != std::string::npos) list.emplace_back(static_cast(dirp->d_name)); } } closedir(dp); return list; } // 遍历指定文件夹下的所有文件夹,不包括指定文件夹下的文件 static std::vector GetListFolders(const std::string &path, const std::string &exten = "*") { std::vector list; list.clear(); DIR *dp = NULL; struct dirent *dirp = NULL; if ((dp = opendir(path.c_str())) == NULL) { return list; } while ((dirp = readdir(dp)) != NULL) { if (dirp->d_type == DT_DIR && strcmp(dirp->d_name, ".") != 0 && strcmp(dirp->d_name, "..") != 0) { if (exten.compare("*") == 0) list.emplace_back(static_cast(dirp->d_name)); else if (std::string(dirp->d_name).find(exten) != std::string::npos) list.emplace_back(static_cast(dirp->d_name)); } } closedir(dp); return list; } // 遍历指定文件夹下的所有文件,包括指定文件夹内的文件夹 static std::vector GetListFilesR(const std::string &path, const std::string &exten = "*") { std::vector list = Tool::GetListFiles(path, exten); std::vector dirs = Tool::GetListFolders(path, exten); // 遍历目录 for (auto it = dirs.cbegin(); it != dirs.cend(); ++it) { // 递归调用扫完 std::vector dirsvecBuf = Tool::GetListFilesR(path + "/" + *it); if (dirsvecBuf.size() > 0) { for (auto dirsvecBufF = dirsvecBuf.cbegin(); dirsvecBufF != dirsvecBuf.cend(); ++dirsvecBufF) { list.emplace_back(*it + "/" + *dirsvecBufF); } } } return list; } // 序列化Array为字符串 static std::string EncodeARRAY(HSQUIRRELVM v, std::string Jso) { Jso += "["; sq_pushnull(v); while (SQ_SUCCEEDED(sq_next(v, -2))) { SQObjectType Type = sq_gettype(v, -1); switch (Type) { case OT_INTEGER: { SQInteger value; sq_getinteger(v, -1, &value); Jso += std::to_string(value); Jso += ","; } break; case OT_FLOAT: { SQFloat value; sq_getfloat(v, -1, &value); Jso += std::to_string(value); Jso += ","; } break; case OT_BOOL: { SQBool value; sq_getbool(v, -1, &value); Jso += std::to_string(value); Jso += ","; } break; case OT_STRING: { const SQChar *value; sq_getstring(v, -1, &value); std::string vstr = value; Jso += "\""; Jso += vstr; Jso += "\""; Jso += ","; } break; case OT_TABLE: { SQInteger Top = sq_gettop(v); SQObject obj; sq_getstackobj(v, -1, &obj); sq_pushobject(v, obj); Jso = EncodeTABLE(v, Jso); sq_settop(v, Top); Jso += ","; } break; case OT_ARRAY: { SQInteger Top = sq_gettop(v); SQObject obj; sq_getstackobj(v, -1, &obj); sq_pushobject(v, obj); Jso = EncodeARRAY(v, Jso); sq_settop(v, Top); Jso += ","; } break; default: break; } // 这里-1是值,-2是键 sq_pop(v, 2); // 在下一次迭代之前弹出键和值 } sq_pop(v, 1); // 在下一次迭代之前弹出键和值 Jso = Jso.substr(0, Jso.length() - 1); Jso += "]"; return Jso; } // 序列化Table为字符串 static std::string EncodeTABLE(HSQUIRRELVM v, std::string Jso) { Jso += "{"; sq_pushnull(v); // null iterator while (SQ_SUCCEEDED(sq_next(v, -2))) { const SQChar *Key; sq_getstring(v, -2, &Key); std::string str = Key; Jso += "\""; Jso += str; Jso += "\""; Jso += ":"; SQObjectType Type = sq_gettype(v, -1); switch (Type) { case OT_INTEGER: { SQInteger value; sq_getinteger(v, -1, &value); Jso += std::to_string(value); Jso += ","; } break; case OT_FLOAT: { SQFloat value; sq_getfloat(v, -1, &value); Jso += std::to_string(value); Jso += ","; } break; case OT_BOOL: { SQBool value; sq_getbool(v, -1, &value); Jso += std::to_string(value); Jso += ","; } break; case OT_STRING: { const SQChar *value; sq_getstring(v, -1, &value); std::string vstr = value; Jso += "\""; Jso += vstr; Jso += "\""; Jso += ","; } break; case OT_TABLE: { SQInteger Top = sq_gettop(v); SQObject obj; sq_getstackobj(v, -1, &obj); sq_pushobject(v, obj); Jso = Tool::EncodeTABLE(v, Jso); sq_settop(v, Top); Jso += ","; } break; case OT_ARRAY: { SQInteger Top = sq_gettop(v); SQObject obj; sq_getstackobj(v, -1, &obj); sq_pushobject(v, obj); Jso = Tool::EncodeARRAY(v, Jso); sq_settop(v, Top); Jso += ","; } break; default: break; } // 这里-1是值,-2是键 sq_pop(v, 2); // 在下一次迭代之前弹出键和值 } sq_pop(v, 1); // 在下一次迭代之前弹出键和值 Jso = Jso.substr(0, Jso.length() - 1); Jso += "}"; return Jso; } };