⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pdu.cpp

📁 口通信 VC 完整串口通信程序Vc++源代码 串口通讯 vc++ 源代码 vc 串口通信 串口通信 mfc 通信 发送程序 vc++ 串口 VC 串口通信程序 完整串口通信程序Vc 源代码 VC串口通
💻 CPP
字号:
#include "stdafx.h"
#include "afx.h"
#include "PDU.h"
#include "tchar.h"
#include "math.h"

string PDU::smsEncodedNumber(string srvNumber)
{
	string s = "";
	if (!(srvNumber.substr(0,2) == "86"))
	{
		srvNumber = "86"+srvNumber;     //检查当前接收手机号是否按标准格式书写,不是,就补上“86”
	}
	int nLength = srvNumber.length();
	for(int i = 1 ; i < nLength ; i += 2)//将奇数位和偶数位交换
	{
		s += srvNumber[i];
		s += srvNumber[i-1];
	}
	if(!(nLength % 2 == 0))//是否为偶数,不是就加上F,并对最后一位与加上的F位互换
	{
		s += 'F';
		s += srvNumber[nLength - 1];
	}
	return s;
}

string PDU::smsEncodedCenterNumber(string srvCenterNumber)
{
	string s = "";
	int nLength = srvCenterNumber.length();
	for(int i = 1 ; i < nLength;i += 2)//奇偶互换
	{
		s += srvCenterNumber[i];
		s += srvCenterNumber[i-1];
	}
	if(!(nLength % 2 == 0))//是否为偶数,不是就加上F,并对最后一位与加上的F位互换
	{
		s += 'F';
		s += srvCenterNumber[nLength - 1];
	}
	s = "0891"+s;//加上91,代表短信中心类型为国际化.固定.

	//sprintf(s,"%x%s",s.length()/2,s);
	//char clen="";
	//itoa(s.length(),&clen,16);
	//s=clen+s;
	//编码后短信中心号长度,并格式化成二位十六制
	return s;
}

string PDU::smsPDUEncoded(char *srvContent)
{
	string sContent="";
	
	int nLenOfWideCharStr=MultiByteToWideChar(CP_ACP,0,srvContent,-1,NULL,0);
	wchar_t	str[2048]={0};
	LPWSTR pWideCharStr=str;
	//PWSTR pWideCharStr;
	//pWideCharStr=(WCHAR*)HeapAlloc(GetProcessHeap(),0,nLenOfWideCharStr*sizeof(WCHAR));
	MultiByteToWideChar(CP_ACP,0,srvContent,-1,pWideCharStr,nLenOfWideCharStr);	
	
	//CString x=(CString)pWideCharStr;
	char c[4]={0};
	for(int i=0;i<nLenOfWideCharStr-1;i++)
	{
		sprintf(c,"%04x",str[i]);
		sContent+=c;
	}
	//HeapFree(GetProcessHeap(), 0, pWideCharStr);//释放内存
	
	return sContent;
}
string PDU::smsEncodedsms(string strCenterNumber, string strNumber, char* strSMScontent)
{
	string s1 = smsEncodedCenterNumber(strCenterNumber);
	string s2 = "11000D91"+ smsEncodedNumber(strNumber)+"000800";
	string s3 = smsPDUEncoded(strSMScontent);
	string slen;
	
	char clen[2]={0};
	int len=(s3.length())/2;
	sprintf(clen,"%02x",len);
	//itoa(len,clen,16);
	string s=s1+s2+clen+s3;
	nLength=(s2.length()+s3.length())/2+1; //获取短信内容加上手机号码长度
	return s;
}


string PDU::GetContent(string SMS)
{
	string c = "";
	//得到内容长度
	string slen = SMS.substr(56, 2);
	int length=StrToHex(slen);
	length *= 2;	
	string content = SMS.substr(58, length);	
	for (int i = 0; i < length; i += 4)
	{
		string temp = content.substr(i, 4);		
		int by = StrToHex(temp);
		CString ascii = by;
		c += ascii;
	}
	
	return c;
}
string PDU::GetTextContent(string SMS)
{	
//	int index=SMS.find("\r");
//	if(index>=0)
//	SMS=SMS.substr(index);
//	index=SMS.find("\n");
//	if(index>=0)
//	SMS=SMS.substr(index);
//	string cont=SMS;
	string cont=SMS.substr(58);
	string tmp="";
	string res="";
	int i=cont.length()-4;
	for(;i>=0;i-=2)
	{
		int ti=i;
		char c[8]={0};
		string sNum=cont.substr(i,2);
		int x=StrToHex(sNum);
		itoa(x,c,2);
		CString str="";
		str.Format("%08s",c);		
		tmp+=str;
	}
	for(i=tmp.length()-7;i>=0;i-=7)
	{
		char c[7]={0};		
		CString str;
		int x=BinToDec(tmp.substr(i,7),7);
		res+=(char)x;
	}

	return res;
}

string PDU::GetDataTime(string SMS)
{
	string time = SMS.substr(42, 12);
	string s = "";
	for (int i = 0; i < 11; i += 2)
	{
		s += time[i + 1];
		s += time[i];
	}
	string t =s.substr(0, 2) + "年" + s.substr(2, 2) + "月" + s.substr(4, 2) + "日" + s.substr(6, 2) + ":" + s.substr(8, 2) + ":" + s.substr(10, 2);
	return t;
}

string PDU::GetTelphone(string SMS)
{
	string tel = SMS.substr(24, 14);
	string s = "";
	for (int i = 0; i < 11; i += 2)
	{
		s += tel[i + 1];
		s += tel[i];
	}
	s += tel[tel.length() - 1];
	return s;
}

bool PDU::IsPDU(string SMS)
{
	string k=SMS.substr(40,2);
	if(k!="08")
		return false;
	return true;
}


int PDU::StrToHex(string Input)
{
	const char* clen;
	clen = Input.c_str();
	int iHex;
	sscanf(clen,"%x",&iHex);
	return iHex;
}


UINT PDU::WChar2Char(LPCWSTR pwszSrc, LPSTR pszDst)
{
	return WideCharToMultiByte(936, 0, pwszSrc, -1, pszDst, MAX_PATH, NULL, NULL);
}

UINT PDU::Char2WChar(LPCSTR pszSrc, LPWSTR pwszDst)
{
	return MultiByteToWideChar(936, 0, pszSrc, -1, pwszDst, MAX_PATH);
}

int PDU::BinToDec(string Input,int len)
{
	int x=0;
	for(int i=len-1;i>=0;i--)
	{
		if(Input[i]=='1')
		{
			x+=pow(2,len-i-1);
		}
	}
	return x;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -