DP_S/include/Tool.h

325 lines
9.2 KiB
C
Raw Normal View History

2024-04-24 10:25:44 +08:00
#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);
2024-04-30 03:01:48 +08:00
//分割字符串
static void Split(const std::string &src, std::vector<std::string> &dest, const std::string &separator);
2024-04-24 10:25:44 +08:00
// 获取当前时间戳
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;
}
};