323 lines
		
	
	
		
			9.1 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			323 lines
		
	
	
		
			9.1 KiB
		
	
	
	
		
			C++
		
	
	
	
| #pragma once
 | ||
| #include <iostream>
 | ||
| #include <iconv.h>
 | ||
| #include <vector>
 | ||
| #include <dirent.h>
 | ||
| #include <string.h>
 | ||
| #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 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<int>(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<std::string> GetListFiles(const std::string &path, const std::string &exten = "*")
 | ||
|     {
 | ||
|         std::vector<std::string> 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<std::string>(dirp->d_name));
 | ||
|                 else if (std::string(dirp->d_name).find(exten) != std::string::npos)
 | ||
|                     list.emplace_back(static_cast<std::string>(dirp->d_name));
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         closedir(dp);
 | ||
| 
 | ||
|         return list;
 | ||
|     }
 | ||
| 
 | ||
|     // 遍历指定文件夹下的所有文件夹,不包括指定文件夹下的文件
 | ||
|     static std::vector<std::string> GetListFolders(const std::string &path, const std::string &exten = "*")
 | ||
|     {
 | ||
|         std::vector<std::string> 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<std::string>(dirp->d_name));
 | ||
|                 else if (std::string(dirp->d_name).find(exten) != std::string::npos)
 | ||
|                     list.emplace_back(static_cast<std::string>(dirp->d_name));
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         closedir(dp);
 | ||
| 
 | ||
|         return list;
 | ||
|     }
 | ||
| 
 | ||
|     // 遍历指定文件夹下的所有文件,包括指定文件夹内的文件夹
 | ||
|     static std::vector<std::string> GetListFilesR(const std::string &path, const std::string &exten = "*")
 | ||
|     {
 | ||
|         std::vector<std::string> list = Tool::GetListFiles(path, exten);
 | ||
| 
 | ||
|         std::vector<std::string> dirs = Tool::GetListFolders(path, exten);
 | ||
| 
 | ||
|         // 遍历目录
 | ||
|         for (auto it = dirs.cbegin(); it != dirs.cend(); ++it)
 | ||
|         {
 | ||
|             // 递归调用扫完
 | ||
|             std::vector<std::string> 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;
 | ||
|     }
 | ||
| };
 |