本章将介绍 Util 及其下面的工具包
string nowDate = DateUtil::getTimeString("%Y-%m-%d %I:%M:%S");
//秒级
uint64_t times = DateUtil::getTimeStamp();
//毫秒级
uint64_t timems = DateUtil::getMsTimeStamp2();
vector<uint8_t> pData;
std::string rData = StringUtil::charsToString(pData.data(), pData.size());
int ret = FileUtil::copyPath("/customer/usr", "/vender/udisk_sda1");
if (listen_st <= 0) listen_st = Util::socketCreate(88);
if (listen_st <= 0) return;
client_st = Util::socketAccept(listen_st);
if (client_st < 0) return;
无论是哪种工具包,都需要引入相应的头文件
// 需要引入头文件哦
// 例
#include "util/DateUtil.h"
#include "util/FileUtil.h"
#include "util/StringUtil.h"
//...
下面将依次介绍工具包中的各个函数的使用方法
需要引入#include "util/DateUtil.h"
/**
* @LEVEL0
* @brief 获取系统当前日、月、年、时、分、秒
* @param f [Y,M,D,hh,mm,ss] Y取年;M取月[1..12];D取日期;hh取小时;mm取分钟;ss取秒数
* @return 指定的f相应的值
* @usage 如getDate("Y")得到2024
*/
static int getDate(string f);
/**
* @LEVEL0
* @brief 返回本地今天日期yyyyMMdd整数
*/
static int today();
/**
* @LEVEL1
* @brief 获取系统当前时间字符串
* @param f 格式字符串, 类似"%Y-%m-%d %H:%M:%S"
* 详细参数,如下:
%a 星期几的简写
%A 星期几的全称
%b 月份的简写
%B 月份的全称
%c 标准的日期的时间串
%C 年份的前两位数字
%d 十进制表示的每月的第几天
%D 月/天/年
%e 在两字符域中,十进制表示的每月的第几天
%F 年-月-日
%g 年份的后两位数字,使用基于周的年
%G 年份,使用基于周的年
%h 简写的月份名
%H 24小时制的小时
%I 12小时制的小时
%j 十进制表示的每年的第几天
%m 十进制表示的月份
%M 十时制表示的分钟数
%n 新行符
%p 本地的AM或PM的等价显示
%r 12小时的时间
%R 显示小时和分钟:hh:mm
%S 十进制的秒数
%t 水平制表符
%T 显示时分秒:hh:mm:ss
%u 每周的第几天,星期一为第一天 (值从1到7,星期一为1)
%U 第年的第几周,把星期日作为第一天(值从0到53)
%V 每年的第几周,使用基于周的年
%w 十进制表示的星期几(值从0到6,星期天为0)
%W 每年的第几周,把星期一做为第一天(值从0到53)
%x 标准的日期串
%X 标准的时间串
%y 不带世纪的十进制年份(值从0到99)
%Y 带世纪部分的十制年份
%z,%Z 时区名称,如果不能得到时区名称则返回空字符。
%% 百分号
常用: yyyy-mm-dd hh:mm:ss = %Y-%m-%d %I:%M:%S
* @return
*/
static string getTimeString(string f);
/**
* @LEVEL0
* @brief 获取时间戳(毫秒,从开机开始计算)
*/
static uint64_t getMsTimeStamp();
/**
* @LEVEL0
* @brief 获取时间戳(毫秒,从1970开始计算)
*/
static uint64_t getMsTimeStamp2();
/**
* @LEVEL0
* @brief 获取指定时刻时间戳(毫秒,从1970开始计算)
*/
static uint64_t getMsTimeStamp2(int ymd,int hour,int minute,int second,int ms);
/**
* @LEVEL0
* @brief 获取时间戳(秒,从1970开始计算)
*/
static uint64_t getTimeStamp();
/**
* @LEVEL0
* @brief 将秒数转换为时:分:秒
* @param seconds 秒数
* @param pad0 只有个位数时,是否补0
*/
static string convert2HMS(int seconds,bool pad0=true,bool mod24=false);
/**
* @LEVEL1
* @brief 设置系统当前时间
* @param year
* @param month
* @param day
* @param hour
* @param min
* @param sec
* @return
*/
static bool setDateTime(int year,int month,int day,int hour,int min,int sec);
/**
* @LEVEL1
* @brief 时区获取
* @return -12 ~ +12(- is west, + is east)
*/
static int getTimezone(void);
/**
* @LEVEL1
* @brief 设置时区
* @param tz -12 ~ +12(- is west, + is east)
*/
static void setTimezone(int tz);
/**
* @LEVEL0
* @brief 将秒数转换为时:分:秒
* @param seconds 秒数
* @param pad0 只有个位数时,是否补0
*/
static string convert2HMS(int seconds,bool pad0=true,bool mod24=false);
/**
* @LEVEL0
* @brief 获取月份的天数
* @param y 年
* @param m 月
* @return 天数
*/
static uint8_t getMonthMaxDay(uint16_t y, uint8_t m);
/**
* @LEVEL0
* @brief 获取星期几
* @param y 年
* @param m 月
* @param d 日
* @return 返回[0..6]
*/
static uint8_t getWeekDay(uint32_t y, uint8_t m, uint8_t d);
/**
* @HideCA
* @brief 获取指定时间的time_t时间(要先转换成标准时区的时间,如当前是北京时间11:00,则hour=11-8=3。可再写一个addHour方法)
*/
static time_t getUnixTime(int year,int month,int day,int hour = 0,int minute = 0,int second = 0);
/**
* @LEVEL0
* @brief 增减天数
* @param year 增减后会被修改
* @param month 增减后会被修改
* @param day 增减后会被修改
* @param num 增加的天数,负数减少
*/
static void addDays(int& year, int& month, int& day, int num);
/**
* @LEVEL0
* @brief 文件是否存在
* @param filePath 文件路径
* @return 是否存在
*/
static bool fileExists(const string& filePath);
/**
* @LEVEL0
* @brief 目录是否存在
* @param path 目录路径
* @return 是否存在
*/
static bool pathExists(const string& path);
/**
* @LEVEL0
* @brief 创建文本格式文件并写入内容
* @param filePath 完整文件路径名称
* @param content 写入内容
* @param mode 0: 覆盖 1:追加
* 如果文件不存在则创建模式不起作用;
* 如果存在,则模式设置起作用
* @return 是否成功
*/
static bool createTxtFile(const string& filePath, const string& content, int mode=0);
/**
* @LEVEL0
* @brief 读取文本格式文件到字符串
* @param filePath 完整文件路径名称
* @param res 存储结果用字符串
* @return 是否成功
*/
static bool readTxtFile(const string& filePath, string& res);
/**
* @LEVEL0
* @brief 创建目录
* @param path 目录路径
* @return 是否成功
*/
static bool createPath(const string& path);
/**
* @LEVEL0
* @brief 判断目录对象类型
* @param path 目录/文件完整路径
* @return -1:失败 0:文件 1:目录 2:其它
*/
static int isPathOrFile(const string& path);
/**
* @LEVEL0
* @brief 获取目录下内容(包含子目录)
* @param path 目录完整路径
* @param res 返回结果(KV结果,K=文件/目录名称, V存放父目录名)
* @return 是否成功
*/
static bool getPathContent(const string& path, vector<KV_Str_Str>& res);
/**
* @LEVEL0
* @brief 删除文件
* @param filePath 文件完整路径
* @return 是否成功
*/
static bool removeFile(const string& filePath);
/**
* @LEVEL0
* @brief 删除目录下文件名符合正则表达式的文件
* @param dir 文件夹路径
* @param ret 正则表达式
* @return 是否成功
*/
static void removeFiles(const string& dir, const string& reg);
/**
* @LEVEL0
* @brief 删除目录
* @param path 目录完整路径
* @return 是否成功
*/
static bool removePath(const string& path);
/**
* @LEVEL0
* @brief 删除目录下所有内容
* @param path 目录完整路径
* @return 是否成功
*/
static bool clearPath(const string& path);
/**
* @LEVEL0
* @brief 将文件拷贝到指定目录,注意模拟器下路径分隔符使用"/"
* @param srcfile 文件完整路径,注意路径分隔符为"/"
* @param dstdir 目录路径
* @return 是否成功
*/
static bool copyFile(const string& srcfile, const string& dstdir);
/**
* @LEVEL2
* @brief 文件复制
* @param srcfile 源文件路径
* @param dstfile 目标文件路径
*/
static bool copyFile2(const string& srcfile, const string& dstfile);
/**
* @LEVEL0
* @brief 将目录下所有内容拷贝到指定路径
* @param src 源目录路径
* @param target 目录路径
* @return 是否成功
*/
static bool copyPath(const string& src, const string& target);
/**
* @LEVEL0
* @brief 获取目录下内容,只包含当前目录,不包含子目录及其内容
* @param path 目录完整路径
* @param res 返回结果(KV结果,K=文件/目录名称, V存放父目录名)
* @return 是否成功
*/
static bool getPathFile(const string& path, vector<KV_Str_Str>& res);
/**
* @LEVEL0
* @brief 获取目录空间大小信息
* @param path 目录路径
* @param total 总大小(MB)
* @param free 剩余大小(MB)
* @return 0:执行成功 其它:失败
*/
static int getPathSpace(const string& path, float& total, float& free);
/**
* @LEVEL0
* @brief 将sqlite数据库中的表导出为csv文件
* 数据量较大时,需配合线程处理
* @param pathdb sqlite数据库文件路径
* @param tbname 指定表名
* @param pathcsv 导出csv文件路径
* @param err 错误信息
* @return true~成功;false~失败
*/
static bool exportDB2CSV(const string& pathdb,const string& tbname, const string& pathcsv, string& err);
/**
* @HIDECA
* @brief 获取导出的目录,ARM下只能是U盘根目录,模拟器下只能是./data,子目录无效
* @param subdir 子目录,1层
* @note 如果U盘不存在,返回"",否则返回 "/vendor/udisk_sdxy/subdir/"
*/
static string getExportDir(const string& subdir);
/**
* @LEVEL0
* @brief 将表格导出到文件(csv)
* @param table
* @param path
* @return 0:成功 其它:失败
*/
static int exportTableToFile(TTable& table, const string& path, bool overwrite=true);
/**
* @LEVEL0
* @brief 从csv导入数据到表格
* @param table
* @param path
* @return 0:成功 其它:失败
*/
static int importTableFromFile(TTable& table, const string& path);
我们对 c++原生的字符串处理做了进一步封装,需要引入#include "util/StringUtil.h"
/**
* @LEVEL2
* @brief string转int方法(返回转换结果)
* @param str 源字符串
* @return
*/
static int safeStoi(const string& str);
/**
* @LEVEL2
* @brief string转int方法(可判断转换结果)
* @param src 源字符串
* @param result 转换结果
* @return
*/
static bool safeStoi(const string& str, int& result);
/**
* @LEVEL2
* @brief string转float方法(返回转换结果)
* @param str 源字符串
* @return
*/
static float safeStof(const string& str);
/**
* @LEVEL2
* @brief string转float方法(可判断转换结果)
* @param src 源字符串
* @param result 转换结果
* @return
*/
static bool safeStof(const string& str, float& result);
/**
* @LEVEL2
* @brief string转long long方法(返回转换结果)
* @param str 源字符串
* @return
*/
static long long safeStoll(const string& str);
/**
* @LEVEL2
* @brief string转long long方法(可判断转换结果)
* @param src 源字符串
* @param result 转换结果
* @return
*/
static bool safeStoll(const string& str, long long& result);
/**
* @LEVEL2
* @brief string转double方法(返回转换结果)
* @param str 源字符串
* @return
*/
static double safeStod(const string& str);
/**
* @LEVEL2
* @brief string转double方法(可判断转换结果)
* @param src 源字符串
* @param result 转换结果
* @return
*/
static bool safeStod(const string& str, double& result);
/**
* @LEVEL2
* @brief 字符数组转换HEX字符串 形如:0x5A->5A
* @param data 字符数组指针
* @param len 长度
* @return
*/
static string charsToString(unsigned char* data, int len);
/**
* @LEVEL2
* @brief HEX字符串转换字符数组(用户需保证data长度足够) 形如:5A->0x5A
* @param str 源字符串
* @param data 转换出的字符数组
* @return 数组有效长度
*/
static int StringToChars(const string& str, unsigned char* data);
/**
* @LEVEL2
* @brief vector<uint8_t>转换字符串
* @param arry 源
* @param coding 扩展
* @return
*/
static string charArrayToString(vector<uint8_t>& arry, const string& coding="");
/**
* @LEVEL2
* @brief 字符串vector<uint8_t>
* @param src 源
* @param coding 扩展
* @return
*/
static vector<uint8_t> stringToCharArray(const string& src, const string& coding="");
该方法适用于任何一个串口收发的字符数组打印,为十六进制字符
vector<uint8_t> pData;
std::string rData = StringUtil::charsToString(pData.data(), pData.size());
/**
* @brief map转json字符串
* @param jsonMap
* @return
*/
static string mapToJson(map<string,string>& jsonMap);
/**
* @brief 指名数据是数字类型
* @param str
* @return
*/
static string vertInt(const string& str);
/**
* @LEVEL2
* @brief 键值对列表转jsonc字符串
* @param arry
* @return
*/
static string vectorToJsonc(vector<KV_Str_Str>& arry);
/**
* 规则匹配检查
*
* 常用表达式
* 1. 校验数字的表达式
* 数字 :"^[0-9]*$"
* n位的数字 :"^[0-9]{4}$"
* 至少 n 位的数字 :"^[0-9]{n,}$"
* m-n 位的数字 :"^[0-9]{m,n}$"
* 零和非零开头的数字 :"^(0|[1-9][0-9]*)$"
* 非零开头的最多带两位小数的数字 :R"(^[1-9]\d*(\.\d{1,2})?$)"
* 带 1~2 位小数的正数或负数 :R"(^-?\d+(\.\d{1,2})?$)"
* 正数,负数,和小数:"^(-|\\+)?[0-9]+(.[0-9]+)?$"
* 有两位小数的正实数 :R"(^\d+(\.\d{2})?$)"
* 有 1~3 位小数的正实数 :R"(^\d+(\.\d{1,3})?$)"
* 非零的正整数 :"^[1-9][0-9]*$" 或 "^([1-9][0-9]*){1,3}$" 或 "^\\+?[1-9][0-9]*$"
* 非零的负整数 :"^-[1-9][0-9]*$"
* 非负整数 :"^[0-9]+$" 或 R"(^\d+$)"
* 非正整数 :R"(^0$|^[1-9]\d*$)" 或 "^((-[0-9]+)|(0+))$"
* 非负浮点数 : "^[0-9]+(.[0-9]+)?$" 或 R"(^(0|[1-9][0-9]*)\.[0-9]*|[1-9][0-9]*|0(\.0+)?$)"
* 非正浮点数 : "^((-[0-9]+(.[0-9]+)?)|(0+(.0+)?))$" 或 R"(^(-\d+(\.\d+)?|0(\.\d+)?)$)"
* 正浮点数 : R"(^\d+(\.\d+)?$)" 或 "^[+]?([0-9]+([.][0-9]*)?|[.][0-9]+)$"
* 负浮点数 : R"(^-\d+(\.\d+)?$)" 或 "^(-(([0-9]+.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*.[0-9]+)|([0-9]*[1-9][0-9]*)))$"
* 浮点数 : "^(-?[0-9]+)(.[0-9]+)?$" 或 R"(^-?\d+(\.\d+)?$)"
* 最多m位整数,n位小数的实数:"^[0-9]{0,m}(.[0-9]{0,n})?$"
*
* 2. 校验字符的表达式
* 汉字 :"^[\u4e00-\u9fa5]{0,}$"
* 英文和数字 : "^[A-Za-z0-9]+$" 或 "^[A-Za-z0-9]+$"
* 长度为 3~20 的所有字符 : "^.{3,20}$"
* 由 26 个英文字母组成的字符串 : "^[a-zA-Z]+$"
* 由 26 个大写英文字母组成的字符串 : "^[A-Z]+$"
* 由 26 个小写英文字母组成的字符串 : "^[a-z]+$"
* 由数字和 26 个英文字母组成的字符串 : "^[A-Za-z0-9]{4,40}$"
* 由数字 , 26 个英文字母或者下划线组成的字符串 : "^[a-zA-Z0-9_]+$"
* 中文 , 英文 , 数字包括下划线 : "^[\u4E00-\u9FA5A-Za-z0-9_]+$"
* 中文 , 英文 , 数字但不包括下划线等符号 : "^[\u4E00-\u9FA5A-Za-z0-9]+$"
* 可以输入含有^%&',;=?$\"等字符 : R"(.*)"
* 禁止输入含有 ~ 的字符 : "^[^~]+$"
*
* 3. 特殊需求表达式
* Email 地址 : R"([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,})"
* 域名 : R"([a-zA-Z0-9.-]+\.[a-zA-Z]{2,})"
* InternetURL : R"(^(https?:\/\/)?([^\s.]+\.[^\s]{2,}|localhost)(\/[^\s]*)?$)"
* 国内手机号码 :R"(^1[3-9]\d{9}$)"
* 国内电话号码 (0511-4405222 , 021-87888822) : R"(^0\d{2,3}-\d{7,8}$)"
* 身份证号 (15 位 , 18 位数字) :"^[1-9][0-9]{5}(19|20)[0-9]{2}(0[1-9]|1[0-2])(0[1-9]|[1-2][0-9]|3[0-1])[0-9]{3}[0-9X]$"
* 短身份证号码 (数字,字母x结尾)1 :"^([0-9]){7,18}(x|X)?$" 或 "^[0-9]{8,18}|[0-9x]{8,18}|[0-9X]{8,18}?$"
* 帐号是否合法(字母开头,允许 5~16 字节,允许字母数字下划线) :"^[a-zA-Z][a-zA-Z0-9_]{4,15}$"
* 密码 (以字母开头,长度在 6~18 之间,只能包含字母 , 数字和下划线) :"^[a-zA-Z][a-zA-Z0-9_]{5,17}$"
* 强密码 (必须包含大小写字母和数字的组合,不能使用特殊字符) :"^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])[a-zA-Z0-9]+$"
* 日期格式-:/分隔 :R"(^[0-9]{4}[-:/][0-9]{2}[-:/][0-9]{2}$)"
*
* @param reg 正则表达式(*注意:\w不识别)
* @param str 比对的字符串
* @return
*/
static bool match(const string& reg, const string& str);
/**
* @LEVEL0
* @brief 判断字符串是否以某字符串开始
* @param s 长串
* @param sub 子串
* @return
*/
static bool startWith(const string& s, const string& sub);
/**
* @LEVEL0
* @brief 判断字符串是否以某字符串结尾
* @param s 长串
* @param sub 子串
* @return
*/
static bool endWith(const string& s, const string& sub);
/**
* @LEVEL1
* @brief 数字转格式化字符串
* @param fvalue 要转换的值
* @param fraclen 小数位数
* @param thousandth 是否显示千分位
* @param intnum 整数位(<=0无效)
* @param intbl 整数位前缀补零
* @param prefix 前缀
* @param suffix 后缀
* @return 输出结果
*/
static string formatFloat(double fvalue, int fraclen, bool thousandth, int intnum=0, bool intbl=false, const string& prefix="", const string& suffix="");
/**
* @LEVEL1
* @brief 长整型格式化日期字符串
* @param lvalue 秒数 1970.1.1开始
* @param deli1 年月日之间的分隔符,如"-","/";像2023年1月1日,则deli1="中文"
* @param deli2 时分秒之间的分隔符,如":";像12时13分04秒,则deli2="中文"
* @param showYear 是否显示年份
* @param showMonth 是否显示月份
* @param showDay 是否显示日期
* @param showHour 是否显示小时
* @param showMinute 是否显示分钟
* @param showSecond 是否显示秒数
* @param showWeek 是否显示星期几
* @param isLocal 是否本地时间
* @return 根据需求组合显示的字符串
*/
static string formatDate(unsigned long long lvalue,
const string& deli1, const string& deli2, bool showYear, bool showMonth, bool showDay,
bool showHour,bool showMinute,bool showSecond,bool showWeek, bool isLocal=true);
/**
* @LEVEL1
* @brief 浮点数转科学计数法显示
* @param fvalue 浮点数
* @param fraclen 小数位
* @return 输出结果
*/
static string formatScience(double fvalue, int fraclen);
/**
* @LEVEL1
* @brief 16进制字符串转无符号整型
* @param str
* @return
*/
static uint hexToUInt(const string& str);
/**
* @LEVEL0
* @brief 字符串分割成字符串列表
* @param str 源字符串
* @param split 分割字符
* @param res 返回结果
*/
static void split(const string& str, const string& split, vector<string>& res);
/**
* @LEVEL0
* @brief 字符串列表拼接为字符串
* @param src 字符串列表
* @param sub 分割字符
* @return 字符串
*/
static string join(vector<string> src, const string& sub);
/**
* @LEVEL0
* @brief 按长度分割字符串
* @param len 每段长度
* @param c 补齐字符,长度不足按指定字符补齐
* @param src 被分割的字符串
* @return
*/
static vector<string> splitByLength(int len, char c, string& src);
/**
* @LEVEL0
* @brief 格式化字符串输出,类似printf(注意最后有\n)
* @param pszFmt 如:StringUtil::snprintf("%s,%s", "hello", "world")
* @return 返回格式化字符串
*/
static string snprintf(const char* pszFmt, ...);
/**
* @LEVEL0
* @brief 转换为小写
* @param src 源字符串
* @return 返回小写串
*/
static string toLowerCase(const string& src);
/**
* @LEVEL0
* @brief 转换为大写
* @param src 源字符串
* @return 返回大写串
*/
static string toUpperCase(const string& src);
/**
* @LEVEL0
* @brief 字符串替换
* @param str 原字符串
* @param from 要替换
* @param to 替换为
* @return 返回替换后的串
*/
static string replace(string str, const string& from, const string& to);
/**
* @LEVEL1
* @brief 用正则表达式进行字符串替换
* 例子:
* string str = "Hello, World!";
* result = replace(str, "World", "C++") //替换所有的 "World" 为 "C++"
* result = replace(str, "[Ww]orld", "C++") //替换所有的 "World" 或 "world" 为 "C++"
* result = replace(str, "[a-zA-Z]+", "C++") //替换所有的单词为 "C++"
* result = replace(str, "\\b\\w+\\b", "C++") //替换所有的单词为 "C++"
*
* @param str 原字符串
* @param pattern 表达式
* @param to 替换为
* @return
*/
static string rreplace(string str, const string& pattern, const string& to);
/**
* @LEVEL2
* @brief 字符串编码格式转换
* 具体编码字符参考https://www.gnu.org/software/libiconv/
* 例如“UTF-8”UCS-2, UCS-2BE, UCS-2LE EUC-CN, HZ, GBK, CP936, GB18030
UCS-4, UCS-4BE, UCS-4LE
UTF-16, UTF-16BE, UTF-16LE
UTF-32, UTF-32BE, UTF-32LE
C99, JAVA UTF-7
* @param from 原始编码方式
* @param to 目标编码方式
* @param str 源字符串
* @return 转换编码方式后的字符串
*/
static string trancoding(const string& from, const string& to, const string& str);
/**
* @LEVEL2
* @brief 字符串trim操作
* @param s 源字符串
* @return
*/
static string trim(string s);
static string trim(string s, char c);
需要引入#include "util/Util.h"
,该文章只介绍部分常用函数,具体详见 util/Util.h 文件
/**
* @LEVEL0
* @brief 整型数转BCD
* @param decimal
* @return
*/
static int DecimalToBCD(int decimal);
/**
* @LEVEL0
* @brief BCD转32位整型数
* @param bcd
* @return
*/
static unsigned int BCDtoDecimal(unsigned int bcd);
/**
* @LEVEL0
* @brief 16位BCD转16位整型数
* @param bcd
* @return
*/
static int16_t BCD16toDecimal(int16_t bcd);
/**
* @LEVEL0
* @brief 16位整型数转16位BCD
* @param decimal
* @return
*/
static int16_t DecimalToBCD16(int16_t decimal);
/**
* @LEVEL0
* @brief 32位BCD转32位整型数
* @param bcd
* @return
*/
static int32_t BCD32toDecimal(int32_t bcd);
/**
* @LEVEL0
* @brief 32位整型数转32位BCD
* @param decimal
* @return
*/
static int32_t DecimalToBCD32(int32_t decimal);
/**
* @LEVEL1
* @brief 从json字符串获取key值
* @param setting
* @param key
* @return 找不到则返回""
*/
static string getValFromJsonc(const string& json, const string& key);
/**
* @LEVEL1
* @brief 批量从jsonc字符串获取属性值
* 以字符串返回值(只能取一层)
* @param json json字符串
* @param kvs KV键值对,用于传入要取值的键,返回得到的值对
* @return true:成功 false:失败
*/
static bool getValsFromJsonc(const string& json, vector<KV_Str_Str>& kvs);
/**
* @LEVEL1
* @brief 批量从jsonc字符串数组vector<KV_Str_Str>对象列表
* @param json json字符串
* @param kvs 返回得到的键值对列表
* @return true:成功 false:失败
*/
static bool getArrayFromJsonc(const string& json, vector<vector<KV_Str_Str>>& kvs);
/**
* @LEVEL1
* @brief 将vector<KV_Str_Str>对象列表转为Jsonc字符串
* @param kvs 键值对列表
* @param json 返回得json字符串
* @return true:成功 false:失败
*/
static bool convertArrayToJson(vector<vector<KV_Str_Str>>& kvs, string& json);
/**
* @LEVEL1
* @brief 连接到指定的主机和端口号
* @param hostname
* @param port
* @return
*/
static int socketConnect(const char *hostname, int port);
/**
* @LEVEL1
* @brief 在port指定的端口上建立server端socket
* @param port
* @return
*/
static int socketCreate(int port);
/**
* @LEVEL1
* @brief server端socket开始accept的函数
* @param listen_st
* @return
*/
static int socketAccept(int listen_st);
/**
* @LEVEL1
* @brief 关闭socket
* @param port
* @return
*/
static int socketClose(int st);
/**
* @LEVEL1
* @brief tcp写数据
* @param handler
* @param buff
* @param len
* @param flag
* @return
*/
static int socketWrite(int64_t handler, char * buff, int len, int flag=0);
/**
* @LEVEL1
* @brief 读tcp数据
* @param handle
* @param buff
* @param recvLen
* @param timeOut
* @param printinfo
* @return
*/
static int socketReadAll(int64_t handle, char * buff,uint8_t recvLen,uint16_t timeOut, bool printinfo=false);
/**
* @LEVEL1
* @brief 打开串口
* @param pFileName
* @param baudRate
* @param byteSize
* @param parity
* @param stopBits
* @return
*/
static int64_t openComPort(const char * pFileName, int baudRate, int byteSize, int parity, int stopBits);
/**
* @LEVEL1
* @brief 串口写
* @param handle
* @param bytes
* @param offset
* @param size
* @return >0:写字节数 <=0:失败
*/
static int uartWrite(int64_t handle, unsigned char * bytes, int offset, int size);
/**
* @LEVEL1
* @brief 关闭串口
* @param handle
*/
static void uartClose(int64_t handle);
/**
* @LEVEL1
* @brief 串口是否可用
* @param handle
* @return
*/
static int uartAvailable(int64_t handle);
/**
* @LEVEL1
* @brief 读串口数据一次
* @param handle
* @param bytes 存放读到的数据
* @param offset
* @param size
* @return
*/
static int uartRead(int64_t handle, unsigned char * bytes, int offset, int size);
/**
* @LEVEL1
* @brief 读取串口数据
*/
static int uartReadAll(int64_t handle, char * buff,uint8_t recvLen,uint16_t timeOut, bool printinfo=false);
/**
* @LEVEL1
* @brief 设置参数
* @param settings 串口控件参数
* @return 是否成功
*/
bool set(const string& settings="");
/**
* @LEVEL1
* @biref 打开串口控件
* @return
*/
bool open();
/**
* @LEVEL1
* @biref 暂停
* @return
*/
bool pause();
/**
* @LEVEL1
* @biref 继续
* @return
*/
bool resume();
/**
* @LEVEL1
* @biref 清除缓冲区
* @param t 0:读缓冲区 1:写缓冲区
* @return
*/
bool clean(int t=0);
/**
* @LEVEL1
* @biref 关闭串口控件
* @return
*/
bool close();
/**
* @LEVEL1
* @biref 向串口写数据
* @param pData 写入数据
* @return 是否成功
*/
bool writeData(const vector<uint8_t>& cmd);
/**
* @LEVEL1
* @biref 读取串口数据(阻塞式)
* @param pData 存放读出的数据
* @param waittime(ms) 等待时间
* @return 是否成功
*/
bool readData(vector<uint8_t>& pData, int waittime);
/**
* @LEVEL1
* @brief 收到数据处理
* @param code
* @param object
* @param handler
*/
void onEventHandler(uint16_t code, SttObject* object, EHandler handler);
读写数据可以参考串口收发案例
/**
* @LEVEL1
* @brief 执行shell命令
* @param cmdline shell命令
* @param mode "r" "w"
* @return 1: 失败 0:成功
*/
static int exe(const string& cmdline, const string& mode);
/**
* @LEVEL1
* @brief 同步执行shell命令,并获取执行结果
* @param cmdline shell命令
* @param mode "r"可以对返回的流进行读取; "w"可以对返回的流进行写入
* @param result [输出]返回结果
* @return false: 失败 true:成功
*/
static bool exeSync(const string& cmdline, const string& mode, string& result);