int gsmDecodePdu(const char* pSrc, SM_PARAM* pDst)
{
int nDstLength; // 目标PDU串长度
unsigned char tmp; // 内部用的临时字节变量
unsigned char buf[256]; // 内部用的缓冲区
PString bufsmsget=pSrc;
// SMSC地址信息段
// SMSC地址信息段
gsmString2Bytes((const char*)bufsmsget, &tmp, 2); // 取长度
tmp = ( tmp - 1) * 2;//tmp = (tmp - 1) * 2; // SMSC号码串长度
int ntmp = tmp;//14
PTRACE(1,"smsc len="<<ntmp<<"/r/n");
bufsmsget = bufsmsget.Right(bufsmsget.GetLength()-4);//pSrc += 4; // 指针后移,忽略了SMSC地址格式
//683108501945F4 040D91 685169005953F1 00F060 016151615423 02421C
char SCA[16];//683108501945F4
PTRACE(1,"gsmSerializeNumbers/r/n");
gsmSerializeNumbers((const char*)bufsmsget, SCA, ntmp); // 转换SMSC号码到目标PDU串
bufsmsget = bufsmsget.Right(bufsmsget.GetLength()-ntmp);//pSrc += tmp;
//040D91 685169005953F1 00F060 016151615423 02421C
PTRACE(1,"gsmSerializeNumbers tmp="<<ntmp<<"/r/n");// 指针后移
// TPDU段基本参数
gsmString2Bytes((const char*)bufsmsget, &tmp, 2); // 取基本参数
bufsmsget = bufsmsget.Right(bufsmsget.GetLength()-2);//pSrc += 2; // 指针后移
//0D91 685169005953F1 00F060 016151615423 02421C
// 取回复号码
gsmString2Bytes((const char*)bufsmsget, &tmp, 2); // 取长度->0d=13
if(tmp & 1) tmp += 1; // 调整奇偶性 ntmp=14;
ntmp=tmp;
PTRACE(1,"ret len="<<ntmp<<"/r/n");
bufsmsget = bufsmsget.Right(bufsmsget.GetLength()-4);//pSrc += 4; // 指针后移,忽略了回复地址(TP-RA)格式
//685169005953F1 00F060 016151615423 02421C
char TPA[16];
gsmSerializeNumbers((const char*)bufsmsget, TPA, tmp); // 取TP-RA号码
bufsmsget = bufsmsget.Right(bufsmsget.GetLength()-tmp);//pSrc += tmp; // 指针后移
//00F060 016151615423 02421C
// TPDU段协议标识、编码方式、用户信息等
char TP_PID;
gsmString2Bytes((const char*)bufsmsget, (unsigned char*)&TP_PID, 2); // 取协议标识(TP-PID)
bufsmsget = bufsmsget.Right(bufsmsget.GetLength()-2);//pSrc += 2; // 指针后移
//F060 016151615423 02421C
char TP_DCS;
gsmString2Bytes((const char*)bufsmsget, (unsigned char*)&TP_DCS, 2); // 取编码方式(TP-DCS)
bufsmsget = bufsmsget.Right(bufsmsget.GetLength()-2);//pSrc += 2; // 指针后移
//60 016151615423 02421C
char TP_SCTS[16];
gsmSerializeNumbers((const char*)bufsmsget, TP_SCTS, 14); // 服务时间戳字符串(TP_SCTS)
bufsmsget = bufsmsget.Right(bufsmsget.GetLength()-14);//pSrc += 14; // 指针后移
//02
gsmString2Bytes((const char*)bufsmsget, &tmp, 2); // 用户信息长度(TP-UDL)
bufsmsget = bufsmsget.Right(bufsmsget.GetLength()-2);//pSrc += 2; // 指针后移
//421C
if(TP_DCS == GSM_7BIT)
{
// 7-bit解码
int srclen = tmp & 7 ? (int)tmp * 7 / 4 + 2 : (int)tmp * 7 / 4;
PString msg = bufsmsget.Left(srclen);
bufsmsget = bufsmsget.Right(bufsmsget.GetLength()-srclen);//pSrc += srclen;
PTRACE(1,"7-bit解码 "<<srclen<<"/r/n");
}
else if( TP_DCS == GSM_UCS2)
{
// UCS2解码
int srclen = tmp*2;
PString msg = bufsmsget.Left(srclen);
char to[256]="";
const char * from = msg;
int fromlen = srclen;
int outdatalen = gsmDecodeUni2Gb((const unsigned char*)from, ( unsigned char*)to, fromlen);
// LogMessage(1,TPA);
// LogMessage(1, to);
PTRACE(1,"TPA="<<TPA<<",to= "<<to<<"/r/n");
nDstLength=strlen(to);
sprintf(pDst->TPA,TPA);
sprintf(pDst->TP_UD,to);
/
bufsmsget = bufsmsget.Right(bufsmsget.GetLength()-srclen);//pSrc += srclen;
PTRACE(1,"UCS2解码 "<<srclen<<"/r/n");
}
else
{
// 8-bit解码
int srclen = tmp*2;
PString msg = bufsmsget.Left(srclen);
bufsmsget = bufsmsget.Right(bufsmsget.GetLength()-srclen);// pSrc += srclen;
PTRACE(1,"8-bit解码 "<<srclen<<"/r/n");
}
// 返回目标字符串长度
return nDstLength;
}
#ifdef _WINDOWS
int gsmDecodeUcs2(const unsigned char* pSrc, char* pDst, int nSrcLength)
{
int nDstLength; // UNICODE宽字符数目
unsigned short wchar[128]; // UNICODE串缓冲区
// 高低字节对调,拼成UNICODE
for(int i=0; i<nSrcLength/2; i++)
{
wchar[i] = *pSrc++ << 8; // 先高位字节
wchar[i] |= *pSrc++; // 后低位字节
}
// UNICODE串-->字符串
nDstLength = WideCharToMultiByte(CP_ACP, 0, wchar, nSrcLength/2, pDst, 160, NULL, NULL);
// 输出字符串加个结束符
pDst[nDstLength] = '/0';
// 返回目标字符串长度
return nDstLength;
}
#else
int gsmDecodeUcs2(const unsigned char* pSrc, char* pDst, int nSrcLength)
{
return gsmDecodeUni2Gb((const unsigned char*)pSrc,( unsigned char* )pDst,nSrcLength);
}
#endif
{
int nDstLength; // 目标PDU串长度
unsigned char tmp; // 内部用的临时字节变量
unsigned char buf[256]; // 内部用的缓冲区
PString bufsmsget=pSrc;
// SMSC地址信息段
// SMSC地址信息段
gsmString2Bytes((const char*)bufsmsget, &tmp, 2); // 取长度
tmp = ( tmp - 1) * 2;//tmp = (tmp - 1) * 2; // SMSC号码串长度
int ntmp = tmp;//14
PTRACE(1,"smsc len="<<ntmp<<"/r/n");
bufsmsget = bufsmsget.Right(bufsmsget.GetLength()-4);//pSrc += 4; // 指针后移,忽略了SMSC地址格式
//683108501945F4 040D91 685169005953F1 00F060 016151615423 02421C
char SCA[16];//683108501945F4
PTRACE(1,"gsmSerializeNumbers/r/n");
gsmSerializeNumbers((const char*)bufsmsget, SCA, ntmp); // 转换SMSC号码到目标PDU串
bufsmsget = bufsmsget.Right(bufsmsget.GetLength()-ntmp);//pSrc += tmp;
//040D91 685169005953F1 00F060 016151615423 02421C
PTRACE(1,"gsmSerializeNumbers tmp="<<ntmp<<"/r/n");// 指针后移
// TPDU段基本参数
gsmString2Bytes((const char*)bufsmsget, &tmp, 2); // 取基本参数
bufsmsget = bufsmsget.Right(bufsmsget.GetLength()-2);//pSrc += 2; // 指针后移
//0D91 685169005953F1 00F060 016151615423 02421C
// 取回复号码
gsmString2Bytes((const char*)bufsmsget, &tmp, 2); // 取长度->0d=13
if(tmp & 1) tmp += 1; // 调整奇偶性 ntmp=14;
ntmp=tmp;
PTRACE(1,"ret len="<<ntmp<<"/r/n");
bufsmsget = bufsmsget.Right(bufsmsget.GetLength()-4);//pSrc += 4; // 指针后移,忽略了回复地址(TP-RA)格式
//685169005953F1 00F060 016151615423 02421C
char TPA[16];
gsmSerializeNumbers((const char*)bufsmsget, TPA, tmp); // 取TP-RA号码
bufsmsget = bufsmsget.Right(bufsmsget.GetLength()-tmp);//pSrc += tmp; // 指针后移
//00F060 016151615423 02421C
// TPDU段协议标识、编码方式、用户信息等
char TP_PID;
gsmString2Bytes((const char*)bufsmsget, (unsigned char*)&TP_PID, 2); // 取协议标识(TP-PID)
bufsmsget = bufsmsget.Right(bufsmsget.GetLength()-2);//pSrc += 2; // 指针后移
//F060 016151615423 02421C
char TP_DCS;
gsmString2Bytes((const char*)bufsmsget, (unsigned char*)&TP_DCS, 2); // 取编码方式(TP-DCS)
bufsmsget = bufsmsget.Right(bufsmsget.GetLength()-2);//pSrc += 2; // 指针后移
//60 016151615423 02421C
char TP_SCTS[16];
gsmSerializeNumbers((const char*)bufsmsget, TP_SCTS, 14); // 服务时间戳字符串(TP_SCTS)
bufsmsget = bufsmsget.Right(bufsmsget.GetLength()-14);//pSrc += 14; // 指针后移
//02
gsmString2Bytes((const char*)bufsmsget, &tmp, 2); // 用户信息长度(TP-UDL)
bufsmsget = bufsmsget.Right(bufsmsget.GetLength()-2);//pSrc += 2; // 指针后移
//421C
if(TP_DCS == GSM_7BIT)
{
// 7-bit解码
int srclen = tmp & 7 ? (int)tmp * 7 / 4 + 2 : (int)tmp * 7 / 4;
PString msg = bufsmsget.Left(srclen);
bufsmsget = bufsmsget.Right(bufsmsget.GetLength()-srclen);//pSrc += srclen;
PTRACE(1,"7-bit解码 "<<srclen<<"/r/n");
}
else if( TP_DCS == GSM_UCS2)
{
// UCS2解码
int srclen = tmp*2;
PString msg = bufsmsget.Left(srclen);
char to[256]="";
const char * from = msg;
int fromlen = srclen;
int outdatalen = gsmDecodeUni2Gb((const unsigned char*)from, ( unsigned char*)to, fromlen);
// LogMessage(1,TPA);
// LogMessage(1, to);
PTRACE(1,"TPA="<<TPA<<",to= "<<to<<"/r/n");
nDstLength=strlen(to);
sprintf(pDst->TPA,TPA);
sprintf(pDst->TP_UD,to);
/
bufsmsget = bufsmsget.Right(bufsmsget.GetLength()-srclen);//pSrc += srclen;
PTRACE(1,"UCS2解码 "<<srclen<<"/r/n");
}
else
{
// 8-bit解码
int srclen = tmp*2;
PString msg = bufsmsget.Left(srclen);
bufsmsget = bufsmsget.Right(bufsmsget.GetLength()-srclen);// pSrc += srclen;
PTRACE(1,"8-bit解码 "<<srclen<<"/r/n");
}
// 返回目标字符串长度
return nDstLength;
}
#ifdef _WINDOWS
int gsmDecodeUcs2(const unsigned char* pSrc, char* pDst, int nSrcLength)
{
int nDstLength; // UNICODE宽字符数目
unsigned short wchar[128]; // UNICODE串缓冲区
// 高低字节对调,拼成UNICODE
for(int i=0; i<nSrcLength/2; i++)
{
wchar[i] = *pSrc++ << 8; // 先高位字节
wchar[i] |= *pSrc++; // 后低位字节
}
// UNICODE串-->字符串
nDstLength = WideCharToMultiByte(CP_ACP, 0, wchar, nSrcLength/2, pDst, 160, NULL, NULL);
// 输出字符串加个结束符
pDst[nDstLength] = '/0';
// 返回目标字符串长度
return nDstLength;
}
#else
int gsmDecodeUcs2(const unsigned char* pSrc, char* pDst, int nSrcLength)
{
return gsmDecodeUni2Gb((const unsigned char*)pSrc,( unsigned char* )pDst,nSrcLength);
}
#endif