📄 svmapdisp.cpp
字号:
/*********************************************************
Update History:
2000.05.17:procMAPCI,分解“小区识别”为MCC,MNC,LAC,CI
2000.06.14:增加防范措施
2000.07.24:增加防范措施
2000.08.12:由于短消息内容太大,修改显示区格式:
字段号\bit数\字节数(bit数=0时)\显示内容\CC
2000.09.02:length is long format, by LHG
2001.08.09 :zxf add map2+ functions
**********************************************************/
#include "stdafx.h"
extern unsigned char *dispbuf,*recbuf;
extern unsigned char UDTlen;
extern unsigned short displen;
extern void procmoredatadisp(WORD mlen);
extern unsigned char procCONSTRUCTFMT(unsigned char *buf);
unsigned char USERDATAfld[256];
void procExtension(BYTE dfldno);//zxf add
unsigned char iAllLength,iDataLength,iChangeData,iChangeData1;
//add by 2000.06.12
void procMAPIllegalData()
{
procmoredatadisp(UDTlen);
UDTlen = 0;
}
void procNULL(unsigned char dfldno)
{
*dispbuf++=dfldno;//NULL tag
// *dispbuf++=1;
// *dispbuf++=*recbuf;
*dispbuf++=8;
*dispbuf++=*recbuf++;
*dispbuf++=0xcc;
*dispbuf++=dfldno+1;//NULL li
// *dispbuf++=1;
// *dispbuf++=*recbuf;
*dispbuf++=8;
*dispbuf++=*recbuf++;
*dispbuf++=0xcc;
iAllLength=2;
iDataLength=0;
UDTlen-=2;
displen+=8;
}
char procsequencetag(unsigned char dfldno)
{
if ((*(recbuf+1)==0)||(*(recbuf+1)>0x80)&&(*(recbuf+2)==0)) return -1;
*dispbuf++=dfldno;//sequence tag
// *dispbuf++=1;
// *dispbuf++=*recbuf;
*dispbuf++=8;
*dispbuf++=*recbuf++;
*dispbuf++=0xcc;
if(*recbuf==0x80)//indefinite format
{
*dispbuf++=dfldno+1;//sequence parameter li
// *dispbuf++=1;
// *dispbuf++=*recbuf;
*dispbuf++=8;
iAllLength=procCONSTRUCTFMT(recbuf);
iDataLength=iAllLength-1;
iAllLength=iDataLength+2;
*dispbuf++=*recbuf++;
*dispbuf++=0xcc;
displen+=8; //12;
UDTlen-=2;
return 1;
}
else if(*recbuf>0x80) //long formt
{
*dispbuf++=dfldno+1;//sequence parameter li
// *dispbuf++=2;
// *(unsigned short *)dispbuf=*(unsigned short *)recbuf;
// dispbuf+=2;
*dispbuf++=8;
iDataLength=*dispbuf++=*(recbuf+1);//zxf update
iAllLength=iDataLength+3; //zxf update
recbuf+=2;
*dispbuf++=0xcc;
displen+=8; //13;
UDTlen-=3;
return 0;
}
else //short format
{
*dispbuf++=dfldno+1;//sequence parameter li
// *dispbuf++=1;
// *dispbuf++=*recbuf;
*dispbuf++=8;
iDataLength=*dispbuf++=*recbuf++;
iAllLength=iDataLength+2;
*dispbuf++=0xcc;
displen+=8; //12;
UDTlen-=2;
return 0;
}
}
void procsbasicparamap2plus(unsigned char dfldno)
{
if (procsequencetag(dfldno)!=-1){
*dispbuf++=dfldno+2;
if(iDataLength>=32)
{
*dispbuf++=0;
*dispbuf++=iDataLength;
displen+=2;
}
else
{
*dispbuf++=8*iDataLength;
displen++;
}
for(int i=0;i<iDataLength;i++)
{
*dispbuf++=*recbuf++;
}
*dispbuf++=0xcc;
UDTlen-=iDataLength;
displen+=iDataLength+2;
}
}
void procsbasicpara(unsigned char dfldno)
{ unsigned char li,i;
*dispbuf++=dfldno;
// *dispbuf++=1;
// *dispbuf++=*recbuf;
*dispbuf++=8;
*dispbuf++=*recbuf++;
*dispbuf++=0xcc;
*dispbuf++=dfldno+1;
// *dispbuf++=1;
// li=*dispbuf++=*recbuf++;
*dispbuf++=8;
if(*recbuf>=0x81)//2000.09.02 by LHG
{li=*(recbuf+1); recbuf+=2; UDTlen-=3;}
else
{li=*recbuf++; UDTlen-=2;}
*dispbuf++=li;
*dispbuf++=0xcc;
if(UDTlen>li)
UDTlen-=li;
else
{ li=UDTlen; UDTlen=0;}
//update by 2000.08.12
if(li>=32)
{
*dispbuf++=dfldno+2;
*dispbuf++=0; //update by 2000.08.12
*dispbuf++=li;
memcpy(dispbuf,recbuf,li);
dispbuf+=li;
recbuf+=li;
*dispbuf++=0xcc;
displen+=li+12; //li*2+16;
}
else
{
*dispbuf++=dfldno+2;
*dispbuf++=li*8;
for(i=0;i<li;i++) *dispbuf++=*recbuf++;
*dispbuf++=0xcc;
displen+=li+11; //li*2+16;
}
}
void procIMSI(unsigned char dfldno)
{ unsigned char li,i;
*dispbuf++=dfldno;
// *dispbuf++=1;
// *dispbuf++=*recbuf;
*dispbuf++=8;
*dispbuf++=*recbuf++;
*dispbuf++=0xcc;
*dispbuf++=dfldno+1;
// *dispbuf++=1;
// li=*dispbuf++=*recbuf++;
*dispbuf++=8;
iDataLength=li=*dispbuf++=*recbuf++;
iAllLength=iDataLength+2;
*dispbuf++=0xcc;
UDTlen-=li+2;
*dispbuf++=dfldno+2;
// *dispbuf++=li;
// for(i=0;i<li;i++) *dispbuf++=*(recbuf+i);
if((*(recbuf+li-1)&0xf0)==0xf0) //there is fill
*dispbuf++=li*8-4;
else *dispbuf++=li*8;
for(i=0;i<li;i++)
{*dispbuf=(*recbuf&0x0f)<<4;*dispbuf|=(*recbuf&0xf0)>>4;dispbuf++;recbuf++;}
*dispbuf++=0xcc;
displen+=li+11; //li*2+16;
}
unsigned char procsISDNADDR(unsigned char dfldno)
{ unsigned char li,i;
//ADDR TAG
*dispbuf++=dfldno;
// *dispbuf++=1;
// *dispbuf++=*recbuf;
*dispbuf++=8;
*dispbuf++=*recbuf++;
*dispbuf++=0xcc;
//ADDR LI
*dispbuf++=dfldno+1;
// *dispbuf++=1;
// li=*dispbuf++=*recbuf++;
*dispbuf++=8;
iDataLength=li=*dispbuf++=*recbuf++;
iAllLength=iDataLength+2;
*dispbuf++=0xcc;
UDTlen-=li+2;
//ADDR IN
*dispbuf++=dfldno+2;
// *dispbuf++=1;
// *dispbuf++=*recbuf;
*dispbuf++=8;
*dispbuf++=*recbuf++;
*dispbuf++=0xcc;
//ADDR SIGNAL
li--;
*dispbuf++=dfldno+3;
// *dispbuf++=li;
// for(i=0;i<li;i++) *dispbuf++=*(recbuf+i);
if((*(recbuf+li-1)&0xf0)==0xf0) //there is fill
*dispbuf++=li*8-4;
else *dispbuf++=li*8;
for(i=0;i<li;i++)
{*dispbuf=(*recbuf&0x0f)<<4;*dispbuf|=(*recbuf&0xf0)>>4;dispbuf++;recbuf++;}
*dispbuf++=0xcc;
displen+=li+15; //li*2+22;
return (li+2);
}
void procCUGqylstmap2plus()
{
unsigned char li,len,indeffmt,indeffmt2,indeffmt3,oldlen;
unsigned char tempcug,tempcug1,tempcug2;
indeffmt=procsequencetag(USERDATAfld[161]); //CUG签约清单
tempcug=iDataLength-indeffmt*2;
if(iChangeData1>=iAllLength)
iChangeData1-=iAllLength;
else
return;
while(*recbuf==0x30 && tempcug>0) //CUG签约
{
indeffmt2=procsequencetag(USERDATAfld[162]); //CUG签约 sequence
tempcug1=iDataLength-indeffmt2*2;
if(tempcug>=iAllLength)
tempcug-=iAllLength;
else
return;
procsbasicparamap2plus(USERDATAfld[163]); //CUG索引
if(tempcug1>=iAllLength)
tempcug1-=iAllLength;
else
return;
procsbasicparamap2plus(USERDATAfld[164]); //CUG连锁
if(tempcug1>=iAllLength)
tempcug1-=iAllLength;
else
return;
procsbasicparamap2plus(USERDATAfld[165]); //内部CUG选择
if(tempcug1>=iAllLength)
tempcug1-=iAllLength;
else
return;
if(*recbuf==0x30&&tempcug1>0) //存在"基本业务组清单"
{
indeffmt3=procsequencetag(USERDATAfld[166]);//基本业务组清单
tempcug2=iDataLength-indeffmt3*2;
if(tempcug1>=iAllLength)
tempcug1-=iAllLength;
else
return;
while(((*recbuf&0x3f)==2 || (*recbuf&0x3f)==3)&&tempcug2>0)
{
if((*recbuf&0x3f)==2&&tempcug2>0)
{
procsbasicparamap2plus(USERDATAfld[167]); //承载业务码
if(tempcug2>=iAllLength)
tempcug2-=iAllLength;
else
return;
}
else
{
procsbasicparamap2plus(USERDATAfld[168]); //电信业务码
if(tempcug2>=iAllLength)
tempcug2-=iAllLength;
else
return;
}
}//while
if(indeffmt3!=0) {recbuf+=2;UDTlen-=2;}
if(tempcug2!=0)
return;
} //存在"基本业务组清单"
if(indeffmt2!=0) {recbuf+=2;UDTlen-=2;}
if((*recbuf&0x1f)==0&&tempcug1>0)
{
procExtension(USERDATAfld[192]);//扩展(extension) zxf add
if(tempcug1>=iAllLength)
tempcug1-=iAllLength;
else
return;
}
}
if(indeffmt!=0) {recbuf+=2;UDTlen-=2;}
if(tempcug!=0)
return;
}
void procCUGqylst()
{
unsigned char li,len,indeffmt,indeffmt2,indeffmt3,oldlen;
unsigned char tempcug,tempcug1,tempcug2;
if(*recbuf<=0x80)
li=*(recbuf+1);
else
li=*(recbuf+2);
len=procCONSTRUCTFMT(recbuf);
indeffmt=procsequencetag(USERDATAfld[161]); //CUG签约清单
if(indeffmt!=0)//indefinite format
{
while(*recbuf==0x30 && (len>UDTlen)) //CUG签约
{
oldlen=UDTlen;
indeffmt2=procsequencetag(USERDATAfld[162]); //CUG签约 sequence
procsbasicparamap2plus(USERDATAfld[163]); //CUG索引
procsbasicparamap2plus(USERDATAfld[164]); //CUG连锁
procsbasicparamap2plus(USERDATAfld[165]); //内部CUG选择
if(*recbuf==0x30) //存在"基本业务组清单"
{
indeffmt3=procsequencetag(USERDATAfld[166]);//基本业务组清单
while((*recbuf&0x3f)==2 || (*recbuf&0x3f)==3)
{
if((*recbuf&0x3f)==2) procsbasicparamap2plus(USERDATAfld[167]); //承载业务码
else procsbasicparamap2plus(USERDATAfld[168]); //电信业务码
}//while
if(indeffmt3!=0) {recbuf+=2;UDTlen-=2;}
} //存在"基本业务组清单"
if((*recbuf&0x1f)==0) procExtension(USERDATAfld[192]);//扩展(extension) zxf add
if(indeffmt2!=0) {recbuf+=2;UDTlen-=2;}
if(oldlen>UDTlen)
oldlen -= UDTlen;
else
{
UDTlen=0;
return;
}
if(len>oldlen)
len-=oldlen;
else
{ UDTlen=0;
return;
}
}//while:CUG签约
recbuf+=2;UDTlen-=2;
}//indefinite format
else//short\long format
{
while(li>=UDTlen) //CUG签约
{
len=UDTlen;
indeffmt2=procsequencetag(USERDATAfld[162]); //CUG签约 sequence
procsbasicparamap2plus(USERDATAfld[163]); //CUG索引
procsbasicparamap2plus(USERDATAfld[164]); //CUG连锁
procsbasicparamap2plus(USERDATAfld[165]); //内部CUG选择
if(*recbuf==0x30) //存在"基本业务组清单"
{
indeffmt3=procsequencetag(USERDATAfld[166]);//基本业务组清单
while((*recbuf&0x3f)==2 || (*recbuf&0x3f)==3)
{
if((*recbuf&0x3f)==2) procsbasicparamap2plus(USERDATAfld[167]); //承载业务码
else procsbasicparamap2plus(USERDATAfld[168]); //电信业务码
}//while
if(indeffmt3!=0) {recbuf+=2;UDTlen-=2;}
} //存在"基本业务组清单"
if((*recbuf&0x1f)==0) procExtension(USERDATAfld[192]);//扩展(extension) zxf add
//update 2000.07.24 by LHG
if(len>UDTlen)
{
len-=UDTlen;
if(li>len)
li -= len;
else
{UDTlen=0; return; }
}
else
{
UDTlen=0;
return;
}
}//while:(li!=0) CUG签约
}//short\long format
}
void procSSInfo(unsigned char *buf)
{
unsigned char indeffmt,indeffmt2,counter,len;
unsigned char indeffmt1,indeffmt3;//zxf add
BYTE templen,templen1,templen2,templen3;//zxf add
//被提供的SS选择"前转信息""呼叫闭锁信息""cug信息""ss数据""elmpp信息"
if((*recbuf&0x1f)==0)//SS信息选择"前转信息"
{
indeffmt=procsequencetag(*buf); //前转信息 sequence
templen=iDataLength-indeffmt*2;
if((*recbuf&0x3f)==4)
{
procsbasicparamap2plus(*(buf+1)); //SS码
templen-=iAllLength;
}
indeffmt1=procsequencetag(*(buf+2)); //前转特性清单 sequence
templen1=iDataLength-indeffmt1*2;
if(templen<iAllLength)
return;
else
templen-=iAllLength;
while(*recbuf==0x30 && templen1>0)
{
indeffmt2=procsequencetag(*(buf+3)); //前转特性 sequence
templen2=iDataLength-indeffmt2*2;
if(templen1<iAllLength)
return;
else
templen1-=iAllLength;
//基本业务:"承载业务"和"电信业务"选择其一
if((*recbuf&0x3f)==2&&templen2>0)
{
procsbasicparamap2plus(*(buf+4));//承载业务
if(templen2>=iAllLength)
templen2-=iAllLength;
else
return;
}
else if((*recbuf&0x1f)==3&&templen2>0)
{
procsbasicparamap2plus(*(buf+5));//电信业务
if(templen2>=iAllLength)
templen2-=iAllLength;
else
return;
}
if((*recbuf&0x3f)==0x4)
{
procsbasicparamap2plus(*(buf+6)); //存在SS状态
if(templen2>=iAllLength)
templen2-=iAllLength;
else
return;
}
if((*recbuf&0x3f)==0x5)
{
procsISDNADDR(*(buf+7)); //存在前转至的号码
if(templen2>=iAllLength)
templen2-=iAllLength;
else
return;
}
if((*recbuf&0x3f)==0x8)
{
procsISDNADDR(*(buf+8)); //存在前转至子地址,V2
if(templen2>=iAllLength)
templen2-=iAllLength;
else
return;
}
if((*recbuf&0x3f)==0x6)
{
procsbasicparamap2plus(*(buf+9)); //存在前转选择
if(templen2>=iAllLength)
templen2-=iAllLength;
else
return;
}
if((*recbuf&0x3f)==0x7)
{
procsbasicparamap2plus(*(buf+10)); //存在无应答条件时间
if(templen2>=iAllLength)
templen2-=iAllLength;
else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -