Window下Qt一些通用功能函数

7 篇文章 0 订阅
该类库包含一系列静态方法,用于处理日期时间(如获取当前时间戳、设置系统时间)、获取IP地址和Mac地址等。方法包括从2000年1月1日起的时间戳计算、基于时间戳生成日期时间字符串以及系统时间的设置。此外,还提供了获取主机的第一个IPv4地址和Mac地址的函数。
摘要由CSDN通过智能技术生成

头文件

#pragma once
#include <QString>

class CPublicFun
{
public:
	CPublicFun();
	~CPublicFun();
	static QString GetCurrentDataTime();
	//获取从2000年1月1日0点0分0秒的时间戳
	static int GetCurrentDataTimeStamp();
	//获取 时间戳 + 2000年1月1日0点0分0秒  的 时间戳
	static int GetDateTimeByStamp(int iTimeStamp);
	//获取 时间戳 + 2000年1月1日0点0分0秒  的 时间
	static QString GetDateTimeStringByStamp(int iTimeStamp);
	//设置系统时间
	static void SetTime(int iTimeStamp);
	//获取第一个Ip
	static QString getHostIpAddress();
	//获取Mac地址
	static QString getHostMacAddress();
	//获取Mac地址
	static void getHostMacAddress(unsigned char* pOutMAC,int &iLen);
	static QString getHostMacAddressEx();
	//16进制显示内存
	static void MemoryToHex(const char*pInData,int iInDataLen,char* pOutData,int &iOutDataLen);
	static void ShowDataToLog(QString strHeader, unsigned char*pInData, int iInDataLen);
	static QString GetDeviceID();

	static void GetServerTestData(unsigned char cCmd, unsigned char cSubCmd,unsigned char* pOutBUf, int &iOutDataLen);
	static unsigned short GetCRC(const unsigned char * pDataBuf, int iBufLen);

	static void GetHistoryDataSrcPath(QString &strPath);
	static void SetHistoryDataSrcPath(QString strPath);

	static bool FileIsExist(QString strFile);
};

源文件

#include "PublicFun.h"
#include <QDateTime>
#include <QNetworkInterface>  
#include <QList>  
#include <QCoreApplication>
#include <QFile>
#include <QDir>
#include <windows.h>
#include "TransLogWid/LogNotify.h"
#include "include/DataDef.h"
extern CLogOperEx * g_DataInteractionLog;
CPublicFun::CPublicFun()
{
}


CPublicFun::~CPublicFun()
{
}

QString CPublicFun::GetCurrentDataTime()
{
	QDateTime time = QDateTime::currentDateTime();   //获取当前时间 
	QString strTime = time.toString("yyyy-MM-dd hh:mm:ss");
	return strTime;
}

int CPublicFun::GetCurrentDataTimeStamp()
{
	//时间戳计算从2000年1月1日零点以来的秒数
	QDateTime datetime;
	int iBaseTime = datetime.fromString("2000-01-01 00:00:00", "yyyy-MM-dd hh:mm:ss").toTime_t();
	QDateTime time = QDateTime::currentDateTime();   //获取当前时间 
	int iStartTime = time.toTime_t();   //将当前时间转为时间戳 
	return iStartTime - iBaseTime; 
}

int CPublicFun::GetDateTimeByStamp(int iTimeStamp)
{
	QDateTime datetime;
	int iBaseTime = datetime.fromString("2000-01-01 00:00:00", "yyyy-MM-dd hh:mm:ss").toTime_t();
	return iTimeStamp + iBaseTime;
}

QString CPublicFun::GetDateTimeStringByStamp(int iTimeStamp)
{
	int iDateTimeStamp = GetDateTimeByStamp(iTimeStamp);
	QDateTime time = QDateTime::fromTime_t(iDateTimeStamp);
	QString strTime = time.toString("yyyy-MM-dd hh:mm:ss");
	return strTime;
}

void CPublicFun::SetTime(int iTimeStamp)
{
	SYSTEMTIME st;
	memset(&st, 0, sizeof(SYSTEMTIME));
	int iDateTimeStamp = GetDateTimeByStamp(iTimeStamp);
	QDateTime time = QDateTime::fromTime_t(iDateTimeStamp);
	st.wYear = time.date().year();
	st.wMonth = time.date().month();
	st.wDay = time.date().day();
	st.wHour = time.time().hour();
	st.wMinute = time.time().minute();
	st.wSecond = time.time().second();
	st.wMilliseconds = time.time().msec();

	SetLocalTime(&st);
}
QString CPublicFun::getHostIpAddress()
{
	QString strIpAddress;
	QList<QHostAddress> ipAddressesList = QNetworkInterface::allAddresses();
	// 获取第一个本主机的IPv4地址  
	int nListSize = ipAddressesList.size();
	for (int i = 0; i < nListSize; ++i)
	{
		if (ipAddressesList.at(i) != QHostAddress::LocalHost &&
			ipAddressesList.at(i).toIPv4Address() && ipAddressesList.at(i).toString().left(3) == "192")
		{
			strIpAddress = ipAddressesList.at(i).toString();
			break;
		}
	}
	// 如果没有找到,则以本地IP地址为IP  
	if (strIpAddress.isEmpty())
		strIpAddress = QHostAddress(QHostAddress::LocalHost).toString();
	return strIpAddress;
}

QString CPublicFun::getHostMacAddress()
{
	QList<QNetworkInterface> nets = QNetworkInterface::allInterfaces();// 获取所有网络接口列表  
	int nCnt = nets.count();
	QString strMacAddr = "";
	for (int i = 0; i < nCnt; i++)
	{
		// 如果此网络接口被激活并且正在运行并且不是回环地址,则就是我们需要找的Mac地址  
		if (nets[i].flags().testFlag(QNetworkInterface::IsUp) && nets[i].flags().testFlag(QNetworkInterface::IsRunning) && !nets[i].flags().testFlag(QNetworkInterface::IsLoopBack))
		{
			strMacAddr = nets[i].hardwareAddress();
			break;
		}
	}
	return strMacAddr;
}

void CPublicFun::getHostMacAddress(unsigned char* pOutMAC, int &iLen)
{
	QString strMac = getHostMacAddress();
	sscanf(strMac.toStdString().c_str(), "%02x:%02x:%02x:%02x:%02x:%02x", pOutMAC, pOutMAC + 1, pOutMAC + 2, pOutMAC + 3, pOutMAC + 4, pOutMAC + 5);
	iLen = 6;
}

QString CPublicFun::getHostMacAddressEx()
{
	QString strMac = getHostMacAddress();
	unsigned char addr[10] = {0};
	sscanf(strMac.toStdString().c_str(), "%02x:%02x:%02x:%02x:%02x:%02x", addr, addr + 1, addr + 2, addr + 3, addr + 4, addr + 5);
	QString strRet(( char*)addr);
	return strRet;
}

void CPublicFun::MemoryToHex(const char*pInData, int iInDataLen,char* pOutData, int &iOutDataLen)
{
	QString strRet;
	char szBuf[BUF_SIZE] = { 0 };
	for (int i = 0; i < iInDataLen; i++)
	{
		char szTmp[5] = { 0 };
		sprintf(szTmp, "%02X ", pInData[i]);
		strcat(szBuf, szTmp);
	}
	iOutDataLen = iInDataLen * 2;
	memcpy(pOutData,szBuf,iOutDataLen);
}

void CPublicFun::ShowDataToLog(QString strHeader, unsigned char*pInData, int iInDataLen)
{
	int iOutLen = 0;
	char szBuf[BUF_SIZE] = { 0 };
	for (int i = 0; i < iInDataLen; i++)
	{
		char szTmp[5] = { 0 };
		sprintf(szTmp, "%02X ", pInData[i]);
		strcat(szBuf, szTmp);
	}
	g_DataInteractionLog->LogInfo("[%s][%s][%d] %s:%s ", __FILE__, __FUNCTION__, __LINE__, strHeader.toStdString().c_str(), szBuf);
}

QString CPublicFun::GetDeviceID()
{
	static QString strDeviceID = getHostMacAddress();
	return strDeviceID;
}

void CPublicFun::GetServerTestData(unsigned char cCmd, unsigned char cSubCmd, unsigned char* pOutuf, int &iOutDataLen)
{
	int iIndex = 0;
	unsigned char szBufTemp[BUF_SIZE] = { 0 };
	szBufTemp[iIndex++] = 0x0f; //报文头
	szBufTemp[iIndex++] = 0x00; //报文头

	szBufTemp[iIndex++] = 0x01; //版本号
	szBufTemp[iIndex++] = cCmd; //报文类型
	unsigned short usLen = 23; //报文长度
	int iCrcLen = 19;
    if (cCmd == MSG_TYPE_QUERY)
	{
		usLen = 22;
		iCrcLen = 18;
	}
	memcpy(&szBufTemp[iIndex], &usLen, 2);
	iIndex += 2;
	unsigned char szMac[10] = { 0 };
	int iLen = 0;
	CPublicFun::getHostMacAddress(szMac, iLen);
	memcpy(&szBufTemp[iIndex], szMac, 6);//设备ID
	iIndex += 6;
	iIndex += 4;//报文ID
	int  iTime = CPublicFun::GetCurrentDataTimeStamp();
	memcpy(&szBufTemp[iIndex], &iTime, 4);//时间搓
	iIndex += 4;
	if (0 != cSubCmd)
	{
		szBufTemp[iIndex++] = cSubCmd;//01Ok 80no 消息体
	}
	
	iIndex += 4; //预留

	int iCrc = GetCRC((unsigned char*)&szBufTemp[6], iCrcLen);
	memcpy(&szBufTemp[iIndex], &iCrc, 4);//CRC
	iIndex += 4;
	
	szBufTemp[iIndex++] = 0x55; //报文尾
	szBufTemp[iIndex++] = 0xAA;

	unsigned char szOutBuf[BUF_SIZE] = { 0 };
	sprintf((char*)szOutBuf, "flag cmd=%02X suncmd=%02X :", cCmd, cSubCmd);
	int isize = sizeof("flag cmd=02 suncmd=02 :");
	for (int i = 0; i < iIndex; i++)
	{
		char szTmp[5] = { 0 };
		sprintf(szTmp, "%02X", szBufTemp[i]);
		strcat((char*)&szOutBuf, szTmp);
		isize += 2;
	}
	strcat((char*)&szOutBuf, "\n");
	isize += sizeof("\n");

	memcpy(pOutuf,szOutBuf,isize);
	iOutDataLen = isize - 2;
}

unsigned short CPublicFun::GetCRC(const unsigned char * pDataBuf, int iBufLen)
{
	unsigned short CRC = 0;
	unsigned char i;
	while (iBufLen-- > 0)
	{
		CRC = (CRC ^ (((unsigned int)*pDataBuf) << 8));
		for (i = 0; i < 8; i++)
		{
			if (CRC & 0x8000) CRC = ((CRC << 1) ^ 0x1021);
			else CRC <<= 1;
		}
		pDataBuf++;
	}
	return CRC;
}

void CPublicFun::GetHistoryDataSrcPath(QString &strFilePath)
{
	QString strPath = QCoreApplication::applicationDirPath();
	QString strFileName;
	strFileName.append(strPath);
	strFileName.append("/srcData/DataSrcPath.txt");


	QFile file(strFileName);
	if (file.open(QIODevice::ReadOnly))   //  以只读的方式打开  
	{
		QByteArray by;
		char *bf = NULL;
		by = file.readAll();
		bf = by.data();
		strFilePath.append(by);
	}
	file.close();
}

void CPublicFun::SetHistoryDataSrcPath(QString strFilePath)
{
	QString strPath = QCoreApplication::applicationDirPath();
	QString strFileName;
	strFileName.append(strPath);
	strFileName.append("/srcData/DataSrcPath.txt");


	QFile file(strFileName);
	file.open(QIODevice::WriteOnly);
	QByteArray byte = QTextCodec::codecForName("UTF-8")->fromUnicode(strFilePath);
	file.write(byte);
	file.close();
}

bool CPublicFun::FileIsExist(QString strFile)
{
	QFile file(strFile);
	if (file.exists())
	{
		return true;
	}
	return false;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

设备系统软件集成

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值