菜单

(鑫通态)util工具类-高频使用接口(时间/文件/字符串/网口/串口)

下载

介绍

本章将介绍 Util 及其下面的工具包

常见用法

时间相关部分常用

获取当前的年-月-日 时:分:秒

c++ 复制代码
string nowDate = DateUtil::getTimeString("%Y-%m-%d %I:%M:%S");

获取当前时间戳

c++ 复制代码
//秒级
uint64_t times = DateUtil::getTimeStamp();
//毫秒级
uint64_t timems = DateUtil::getMsTimeStamp2();

字符串常用

收发的字符数组打印,为十六进制字符

c++ 复制代码
vector<uint8_t> pData;
std::string rData = StringUtil::charsToString(pData.data(), pData.size());

文件常用

将"/customer/usr"下的全部内容拷贝到 u 盘中(仅为参考,具体 u 盘路径还需获取)

c++ 复制代码
int ret = FileUtil::copyPath("/customer/usr", "/vender/udisk_sda1");

串口网口常用

创建一个 socket 服务端

c++ 复制代码
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;

引入

无论是哪种工具包,都需要引入相应的头文件

c++ 复制代码
// 需要引入头文件哦
// 例
#include "util/DateUtil.h"
#include "util/FileUtil.h"
#include "util/StringUtil.h"
//...

下面将依次介绍工具包中的各个函数的使用方法

日期类(DateUtil)

需要引入#include "util/DateUtil.h"

获取当前时间

c++ 复制代码
/**
 * @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);

获取时间戳

c++ 复制代码
/**
 * @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);

设置系统时间

c++ 复制代码
/**
 * @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);

其他函数

c++ 复制代码
/**
 * @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);

基本文件操作

c++ 复制代码
/**
 * @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);
  • 两个 copyFile 无区别

导入与导出

c++ 复制代码
/**
 * @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);

字符串类(StringUtil)

我们对 c++原生的字符串处理做了进一步封装,需要引入#include "util/StringUtil.h"

与其他类型的转换

c++ 复制代码
/**
 * @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);

和数组之间的转化

c++ 复制代码
/**
 * @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="");

使用方法

该方法适用于任何一个串口收发的字符数组打印,为十六进制字符

c++ 复制代码
vector<uint8_t> pData;
std::string rData = StringUtil::charsToString(pData.data(), pData.size());

和 json 之间的转化

c++ 复制代码
/**
 * @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);

其他工具

c++ 复制代码
/**
 * 规则匹配检查
 *
 * 常用表达式
 * 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);

其他常用工具(Util)

需要引入#include "util/Util.h",该文章只介绍部分常用函数,具体详见 util/Util.h 文件

类型的相互转化

c++ 复制代码
/**
 * @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);

与 json 的相互转化

c++ 复制代码
/**
 * @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);

socket 相关

c++ 复制代码
/**
 * @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);

串口相关

c++ 复制代码
/**
 * @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);

页面内串口控件使用

c++ 复制代码
/**
 * @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);

读写数据可以参考串口收发案例

执行 linux shell 命令

c++ 复制代码
/**
 * @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);
最近修改: 2025-04-08Powered by