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

📄 svmapdisp.cpp

📁 七号信令解码器
💻 CPP
📖 第 1 页 / 共 5 页
字号:
/*********************************************************
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 + -