📄 pdu.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 + -