#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h>
#include "SMSPDUImp.h"
#ifdef _WIN32
#include <windows.h>
#endif
CSMSPDUImp::CSMSPDUImp()
: m_bWide(false), m_nWideLen(0)
{
}
CSMSPDUImp::~CSMSPDUImp()
{
}
// PDU编码,用于编制、发送短消息
// 输入: pSMSC - 短信服务中心地址参数指针
// pTargetAddress - 目标地址参数指针
// pContent - 短信内容参数指针
// cDCS - 数据编码方式参数指针
// 输出: pTargetPDU - 目标PDU串指针
// 返回: 目标PDU串长度
int CSMSPDUImp::Encode( char * pTargetPDU,const char * pSMSC,const char * pTargetAddress,const char * pContent,char cDCS ) const
{
int nDstLength; // 目标PDU串长度
unsigned char buf[256]={0}; // 内部用的缓冲区
// SMSC地址信息段
nDstLength = EncodeSMSCAddr( pSMSC,pTargetPDU );
// TPDU段基本参数
buf[0] = 0x11; // 是发送短信(TP-MTI=01),TP-VP用相对格式(TP-VPF=10)
buf[1] = 0; // TP-MR=0
nDstLength += Bytes2String( buf,&pTargetPDU[nDstLength],2 );
// 目标地址段
nDstLength += EncodeTargetAddr( pTargetAddress,&pTargetPDU[nDstLength] );
// TPDU段协议标识、编码方式、有效期
memset( buf,0,256 );
buf[0] = 0;//0x00;//pSrc->TP_PID; // 协议标识(TP-PID)
buf[1] = 8;//0x08;//pSrc->TP_DCS; // 用户信息编码方式(TP-DCS)
buf[2] = 0; // 有效期(TP-VP)为5分钟
//nDstLength += Bytes2String( buf,&pTargetPDU[nDstLength],3 );
// 用户信息段
//nDstLength += EncodeUserData( pContent,&pTargetPDU[nDstLength],0x08 );
buf[3]= EncodeUserData( pContent,&buf[4],0x08 ); //lint !e734
int nLength = buf[3] + 4;
nDstLength += Bytes2String( buf,&pTargetPDU[nDstLength],nLength ); // 转换该段数据到目标PDU串
return nDstLength;
/* int nDstLength; // 目标PDU串长度
unsigned char buf[256]={0}; // 内部用的缓冲区
// SMSC地址信息段
nDstLength = EncodeSMSCAddr( pSMSC,pTargetPDU );
// TPDU段基本参数
buf[0] = 0x11; // 是发送短信(TP-MTI=01),TP-VP用相对格式(TP-VPF=10)
buf[1] = 0; // TP-MR=0
nDstLength += Bytes2String( buf,&pTargetPDU[nDstLength],2 );
// 目标地址段
nDstLength += EncodeTargetAddr( pTargetAddress,&pTargetPDU[nDstLength] );
// TPDU段协议标识、编码方式、有效期
memset( buf,0,256 );
buf[0] = 0;//0x00;//pSrc->TP_PID; // 协议标识(TP-PID)
buf[1] = 8;//0x08;//pSrc->TP_DCS; // 用户信息编码方式(TP-DCS)
buf[2] = 0; // 有效期(TP-VP)为5分钟
//nDstLength += Bytes2String( buf,&pTargetPDU[nDstLength],3 );
// 用户信息段
//nDstLength += EncodeUserData( pContent,&pTargetPDU[nDstLength],0x08 );
buf[3]= EncodeUserData( pContent,&buf[4],0x08 );
int nLength = buf[3] + 4;
nDstLength += Bytes2String( buf,&pTargetPDU[nDstLength],nLength ); // 转换该段数据到目标PDU串
return nDstLength;
*/
}//lint !e715
// PDU解码,用于接收、阅读短消息
// 输入: pSrc - 源PDU串指针
// 输出: pDst - 目标PDU参数指针
// 返回: 用户信息串长度
int CSMSPDUImp::Decode( const char * pSrcPDU,char * pSMSC,char * pReplyAddress,char * pContent,char * pDateTime,char &pTP_PID,char &pTP_DCS ) const
{
int nDstLength; // 目标PDU串长度
unsigned char tmp; // 内部用的临时字节变量
// SMSC地址信息段
nDstLength = DecodeSMSCAddr( pSrcPDU,pSMSC );
pSrcPDU += nDstLength;// 指针后移
// TPDU段基本参数
(void)String2Bytes(pSrcPDU, &tmp, 2); // 取基本参数
pSrcPDU += 2; // 指针后移
// 取回复号码
nDstLength = DecodeReplyAddr( pSrcPDU,pReplyAddress );
pSrcPDU += nDstLength;// 指针后移
// TPDU段协议标识、编码方式
(void)String2Bytes(pSrcPDU, (unsigned char*)&pTP_PID, 2); // 取协议标识(TP-PID)
pSrcPDU += 2; // 指针后移
(void)String2Bytes(pSrcPDU, (unsigned char*)&pTP_DCS, 2); // 取编码方式(TP-DCS)
pSrcPDU += 2; // 指针后移
// 服务时间戳字符串(TP_SCTS)
nDstLength = DecodeDateTime( pSrcPDU,pDateTime );
pSrcPDU += nDstLength;
// 用户信息段
(void)DecodeUserData( pSrcPDU,pContent, (char)pTP_DCS );
return 0;
}
// 将地址进行编码,返回编码后的目标字符串长度
// 输入:pSrc - 源数据指针
// 输出: pDst - 目标字符串指针
// 返回: 目标字符串长度
int CSMSPDUImp::EncodeSMSCAddr( const char * pSrc,char * pDst ) const
{
int nLength=0; //内部用的串长度
int nDstLength; //目标PDU串长度
unsigned char buf[256]={0}; //内部用的缓冲区
nLength = strlen(pSrc); //lint !e713
//如果长度不为偶数,则加上"F"号
if( (nLength & 1)!=0 )
buf[0] = (unsigned char)((nLength+1)/2 + 1); // SMSC地址信息长度(包括91)
else
buf[0] = (unsigned char)(nLength/2 + 1); // SMSC地址信息长度(包括91)
buf[1] = 0x91; // 固定: 用国际格式号码
nDstLength = Bytes2String( buf,pDst,2 );// 转换2个字节到目标PDU串
nDstLength += ConvertSemiOctet( pSrc,&pDst[nDstLength],nLength ); // 转换SMSC号码到目标PDU串
return nDstLength;
}
int CSMSPDUImp::DecodeSMSCAddr( const char * pSrc,char * pSMSC ) const
{
const char * pSaveSrc=NULL;
unsigned int nDstLength;
unsigned char cTemp; // 内部用的临时字节变量
pSaveSrc = pSrc;
(void)String2Bytes( pSaveSrc,&cTemp,2 ); // 取长度
cTemp = (cTemp-1)*2; //lint !e734 // SMSC号码串长度
pSaveSrc += 4;// 指针后移,忽略了SMSC地址格式
(void)ConvertSemiOctet( pSaveSrc,pSMSC,cTemp,1 );
pSaveSrc += cTemp;// 指针后移
nDstLength = pSaveSrc - pSrc; //lint !e732
return (int)nDstLength;
}
// 可打印字符串转换为字节数据
// 如:"C8329BFD0E01" --> {0xC8, 0x32, 0x9B, 0xFD, 0x0E, 0x01}
// 输入: pSrc - 源字符串指针
// nSrcLength - 源字符串长度
// 输出: pDst - 目标数据指针
// 返回: 目标数据长度
int CSMSPDUImp::String2Bytes( const char * pSrc,unsigned char * pDst,int nSrcLength ) const
{
for( int i=0; i<nSrcLength; i+=2 )
{
// 输出高4位
if( (*pSrc>='0') && (*pSrc<='9') )
{
*pDst = (*pSrc-'0') << 4; //lint !e701 !e734
}
else
{
*pDst = ((*pSrc-'A')+10) << 4; //lint !e701 !e734
}
pSrc++;
// 输出低4位
if( (*pSrc>='0') && (*pSrc<='9') )
{
*pDst |= *pSrc - '0';
}
else
{
*pDst |= (*pSrc - 'A') + 10;
}
pDst++;
pSrc++;
}
// 返回目标数据长度
return (nSrcLength / 2);
}
// 将地址进行编码,返回编码后的目标字符串长度
// 输入:pSrc - 源数据指针
// 输出: pDst - 目标字符串指针
// 返回: 目标字符串长度
int CSMSPDUImp::EncodeTargetAddr( const char * pSrc,char * pDst ) const
{
int nLength=0; //内部用的串长度
int nDstLength; //目标PDU串长度
unsigned char buf[256]={0}; //内部用的缓冲区
nLength = strlen(pSrc); //lint !e713
buf[0] = (unsigned char)nLength; // 目标地址数字个数(TP-DA地址字符串真实长度,不包括91和'F')
buf[1] = 0x91; // 固定: 用国际格式号码
nDstLength = Bytes2String( buf,pDst,2 );// 转换2个字节到目标PDU串
nDstLength += ConvertSemiOctet( pSrc,&pDst[nDstLength],nLength ); // 转换TP-DA到目标PDU串
return nDstLength;
}
int CSMSPDUImp::DecodeReplyAddr( const char * pSrc,char * pReplyAddr ) const
{
const char * pSaveSrc=NULL;
unsigned int nDstLength;
unsigned char cTemp;
pSaveSrc = pSrc;
(void)String2Bytes( pSaveSrc,&cTemp,2 ); // 取长度
if( cTemp & 1 ) cTemp += 1; // 调整奇偶性
pSaveSrc += 4; // 指针后移,忽略了回复地址(TP-RA)格式
(void)ConvertSemiOctet( pSaveSrc,pReplyAddr,cTemp,1 );
// pSrc += cTemp; // 指针后移
pSaveSrc += cTemp; // 指针后移
nDstLength = pSaveSrc - pSrc; //lint !e732
return (int)nDstLength;
}
int CSMSPDUImp::DecodeDateTime( const char * pSrc,char * pDateTime ) const
{
char buf[256]={0}; //内部用的缓冲区
unsigned int nDateTimeLength=14;
(void)ConvertSemiOctet( pSrc,buf,nDateTimeLength,1 ); //lint !e713
//年:如2004-
strcpy( pDateTime,"20" );
strncpy( pDateTime + 2,buf,2 );
strcpy( pDateTime + 4,"-" );
//月:09
strncpy( pDateTime + 5,buf + 2,2 );
strcpy( pDateTime + 7,"-" );
//日:30
strncpy( pDateTime + 8,buf + 4,2 );
strcpy( pDateTime + 10," " );
//时:12
strncpy( pDateTime + 11,buf + 6,2 );
strcpy( pDateTime + 13,":" );
//分:34
strncpy( pDateTime + 14,buf + 8,2 );
strcpy( pDateTime + 16,":" );
//秒:56
strncpy( pDateTime + 17,buf + 10,2 );
//加结束标志
pDateTime[19] = '\0';
return (int)nDateTimeLength;
}
// 将用户数据进行编码,返回编码后的目标字符串长度
// 输入:pSrc - 源数据指针
// cDCS - 数据编码方式
// 输出: pDst - 目标字符串指针
// 返回: 目标字符串长度
int CSMSPDUImp::EncodeUserData( const char * pSrc,unsigned char * pDst,char cTP_DCS ) const
{
int nLength=0; //内部用的串长度
int nDs
没有合适的资源?快使用搜索试试~ 我知道了~
SMSEntity.rar_短信_短信猫
共48个文件
h:14个
obj:9个
sbr:9个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
5星 · 超过95%的资源 1 下载量 187 浏览量
2022-09-14
21:04:52
上传
评论
收藏 4.52MB RAR 举报
温馨提示
读取短信猫里的短信内容,及向短信猫发送短信的工程
资源推荐
资源详情
资源评论
收起资源包目录
SMSEntity.rar (48个子文件)
SMSEntity
bin
obj
include
config.h 197B
SynchroObject.h 5KB
MyFuncDef.h 867B
ServerThread.h 764B
IBase.h 1KB
SMSEntityBase.h 1KB
SMSItem.h 1KB
ShortMessageQueue.h 647B
Comm.h 1KB
SMSPDUImp.h 2KB
TypeDef.h 4KB
SMSEntity.h 2KB
ISMSPDU.h 521B
ThreadBase.h 1KB
make
makefilesms 928B
makefile 1KB
project
SMSEntity.plg 1KB
SMSEntity.dsp 6KB
Debug
SMSPDUImp.sbr 932KB
Interface.obj 17KB
SMSItem.sbr 124KB
SMSItem.obj 18KB
SMSEntity.pch 7.3MB
ShortMessageQueue.sbr 1.03MB
SynchroObject.sbr 1.01MB
SMSEntity.obj 67KB
Comm.sbr 1.01MB
vc60.idb 249KB
Comm.obj 20KB
ThreadBase.obj 32KB
Interface.sbr 1.04MB
ThreadBase.sbr 1.02MB
SynchroObject.obj 21KB
ShortMessageQueue.obj 64KB
vc60.pdb 148KB
SMSEntity.sbr 1.05MB
ServerThread.obj 78KB
ServerThread.sbr 1.05MB
SMSPDUImp.obj 32KB
source
SynchroObject.cpp 662B
SMSPDUImp.cpp 16KB
Interface.cpp 796B
SMSEntity.cpp 7KB
ThreadBase.cpp 4KB
ShortMessageQueue.cpp 1KB
Comm.cpp 10KB
SMSItem.cpp 3KB
ServerThread.cpp 11KB
共 48 条
- 1
资源评论
- quanjianyou2023-08-22发现一个超赞的资源,赶紧学习起来,大家一起进步,支持!
刘良运
- 粉丝: 68
- 资源: 1万+
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功