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

📄 svisupcri.cpp

📁 七号信令解码器
💻 CPP
字号:
#include "stdafx.h"


#define NOPASS 0
#define PASS 0xff
#define BYTEOFPVAR 3

extern BYTE BUFSETMEM[];

extern BYTE compare(BYTE *code,BYTE *crit,BYTE floh);
extern BYTE compareaddr(BYTE *msg,BYTE *crit);
extern BYTE comparespcode(BYTE *msg,BYTE *crit);
extern BYTE compareDPC14(BYTE *msg,BYTE *crit);
extern BYTE compareOPC14(BYTE *msg,BYTE *crit);


BYTE compareISUPaddr(BYTE *msg,BYTE *crit,BYTE noa)
{BYTE startbit,bitlen,c,temp;
 BYTE code[10];

 startbit=*crit++;
 bitlen=*crit++;		//crit-->logic sign

 if(noa<(startbit+bitlen)) return NOPASS;

 msg += startbit/8;
 startbit %=8;
 if(startbit!=0) //startbit=0
  {
	for (c=0;c<bitlen/8;c++)
	 {temp=*msg; temp&= 0xf0; code[c]=temp>>4;
	  temp=*msg++; temp&=0x0f; code[c] |=temp<<4;
	 }
	if((bitlen%8)!=0)
	 {temp=*msg; temp &= 0xf0; code[c]=temp;}
  } //startbit=0
 else  //startbit=4
  {
	for (c=0;c<bitlen/8;c++)
	 {temp=*msg; temp &= 0xf0; code[c]=temp>>4;
	  temp=(*msg++)&0x0f; code[c] |=temp<<4;
	 }
	if((bitlen%8)!=0)
	 {temp=*msg++; temp &= 0x0f; code[c]=temp<<4;}
  }//startbit=4

 return (compare(&code[0],crit,0));
}



BYTE ISUPmesscri14(BYTE *bmsg,BYTE *crit)
{
  BYTE selecth1h0=0;
  BYTE fldno,numofbyte,varno,head,li;
  BYTE stat,code,*msg,cic[2];
  WORD temp;

  do{
	fldno = *crit++;
	numofbyte=*(crit+3);
	if(fldno<=11)
	{switch (fldno)
	  {
		 case 7://DPC
		  msg=bmsg;
		  if (numofbyte==0)//compare with var
			{varno = (*(crit+4))*BYTEOFPVAR;stat=PASS;
			 if (BUFSETMEM[varno]!=*msg
				||BUFSETMEM[varno+1]!=(*(msg+1)&0x3f) )
			     stat=NOPASS;
			 crit +=5;  //crit-->OR(F7)/AND(F8)/CC
			}
		  else //compare with criteria
			{stat=compareDPC14(msg,crit);
			 if (*(crit+2)==0xf5) numofbyte *=2;//logical sign
			 crit += 4+numofbyte;//crit-->OR(F7)/AND(F8)/CC
			}
		  break;

		 case 8://OPC
		  msg=bmsg+1;
		  if(numofbyte==0)//compare with var
			{varno = (*(crit+4))*BYTEOFPVAR;stat=PASS;
			 if( BUFSETMEM[varno]!=(*msg&0xc0)
				||BUFSETMEM[varno+1]!=*(msg+1)
				||BUFSETMEM[varno+2]!=(*(msg+2)&0x0f) )
			    stat=NOPASS;
			 crit +=5;     //crit-->OR/AND/0xaa
			}
		  else //compare with criteria
			{stat=compareOPC14(msg,crit);
			 if (*(crit+2)==0xf5) numofbyte *=2;//logical sign
			 crit += 4+numofbyte;//crit-->OR(F7)/AND(F8)/CC
			}
		  break;

		 case 9://SLS
		  msg=bmsg+4;          //msg-->sls
		  if (numofbyte==0)//compare with var
			{varno = (*(crit+4))*BYTEOFPVAR;stat=PASS;
			 if (BUFSETMEM[varno]!=(*msg&0xf0)) stat=NOPASS;
			 crit +=5;     //crit-->OR/AND/0xaa
			}
		  else //compare with criteria
			{code=*(bmsg+3)&0xf0; code=code>>4;
			 stat=compare(&code,crit+2,0);
			 if (*(crit+2)==0xf5) numofbyte *=2;//logical sign
			 crit += 4+numofbyte;//crit-->OR(F7)/AND(F8)/CC
			}
		  break;

		 case 10:  //CIC
		  stat=NOPASS;
		  msg=bmsg+4;          //msg-->cic
		  if (numofbyte==0)//compare with var
			{varno = (*(crit+4))*BYTEOFPVAR;stat=PASS;
			 if ((BUFSETMEM[varno]!=*msg)
				||(BUFSETMEM[varno+1]!= ((*(msg+1))&0x0f)) )
			  {stat=NOPASS;break;}
			 crit +=5;     //crit-->OR/AND/0xaa
			}
		  else //compare with criteria
			{temp=*(WORD *)msg;
		     cic[0]=LOBYTE(temp);cic[1]=HIBYTE(temp);
			 stat=compare(&cic[0],crit+2,0);
			 if (*(crit+2)==0xf5) numofbyte *=2;//logical sign
			  crit += 4+numofbyte;//crit-->OR(F7)/AND(F8)/CC
			}
		  break;

		 case 11: //MT
		  selecth1h0=0xff;
		  head=code=*(bmsg+6);
		  stat=compare(&code,crit+2,0);
		  if (*(crit+2)==0xf5) numofbyte *=2;//logical sign
		  crit += 4+numofbyte;//crit-->OR(F7)/AND(F8)/CC
		  break;

		 default:stat=NOPASS; break;
	  }//switch
	}//if(fldno<=11)
	else//field>11
	{switch(head)
	{
		case 0x01://IAM
			switch(fldno)
			{
			case 23://$3.9,P42,过滤被叫号码
				msg=bmsg+14; //msg-->LI of CLDNO
				li=*msg++;  //msg-->ODD/EVEN of CLDNO
				li-=2;
				li*=2;
				if((*msg&0x80)!=0) li--;  //addr is odd
				msg+=2;  //msg-->1st addr
				stat=compareISUPaddr(msg,crit,li);
				break;

			case 40://3.10,P44,过滤主叫号码
				msg=bmsg+14; //msg-->LI of CLDNO
				li=*msg++;  //msg-->ODD/EVEN of CLDNO
				msg+=li;   //msg-->li of TNSN(if exist)
				stat=NOPASS;
				if(*msg==0x23) {msg++; li=*msg++; msg+=li;} //存在转接网选择
				if(*msg==0x01) msg+=8;  //存在呼叫参考
				if(*msg==0x0a)//存在主叫用户号码
				{msg++;  //msg-->LI of CLGPC
				 li=*msg++;  //msg-->ODD/EVEN of CLDNO
				 li-=2;
				 li*=8;
				 if((*msg&0x80)!=0) li-=4;  //addr is odd
				 msg+=2;  //msg-->1st addr
				 stat=compareISUPaddr(msg,crit,li);
				}//存在主叫用户号码
				break;
			default:break;
			}//switch
			break;
		case 0x04://INFO
			if(fldno!=25) {stat=NOPASS;break;}
//过滤主叫号码
			msg=bmsg+9;  //msg-->INFIN
			stat=NOPASS;
			if((*msg&0x03)==0x03)//存在主叫用户号码
			{if((*msg&0x20)==0x20) msg++;
			 msg+=3;  //msg-->li of CLGPC
			 li=*msg++;  //msg-->ODD/EVEN of CLDNO
			 li-=2;
			 li*=8;
			 if((*msg&0x80)!=0) li-=4;  //addr is odd
			 msg+=2;  //msg-->1st addr
			 stat=compareISUPaddr(msg,crit,li);
			}
			break;
		default:break;
	}//switch

	}//field>11


	 crit++;        //crit-->F7/F8/AA

	 if((stat!=PASS && *crit==0xf8)//the condition isn't pass & and
	  ||(stat==PASS && *crit==0xf7))//the condition is pass & or
		  break;
	 else if ((stat==PASS && *crit==0xf8)//condition is pass & OR
			  ||(stat!=PASS && *crit==0xf7))//condition isn't pass & AND
		  crit++;
  } while(*crit!=0xaa);
  return stat;
}


BYTE ISUPmesscri(BYTE *bmsg,BYTE *crit)
{
  BYTE selecth1h0=0;
  BYTE fldno,numofbyte,varno,head,li;
  BYTE c,stat,code,cic[2],*msg;
  WORD temp;

  do{
	fldno = *crit++;
	numofbyte=*(crit+3);

	if(fldno<=11)
	{switch (fldno)
	  {
		 case 7://DPC
		  msg=bmsg;
		  if (numofbyte==0)//compare with var
			{varno = (*(crit+4))*BYTEOFPVAR;stat=PASS;
			 for (c=0;c<3;c++)
			 {if (BUFSETMEM[varno+c]!=*(msg+c)) {stat=NOPASS;break;}}
			 crit +=5;  //crit-->OR(F7)/AND(F8)/CC
			}
		  else //compare with criteria
			{stat=comparespcode(msg,crit);
			 if (*(crit+2)==0xf5) numofbyte *=2;//logical sign
			 crit += 4+numofbyte;//crit-->OR(F7)/AND(F8)/CC
			}
		  break;

		 case 8://OPC
		  msg=bmsg+3;
		  if(numofbyte==0)//compare with var
			{varno = (*(crit+4))*BYTEOFPVAR;stat=PASS;
			 for (c=0;c<3;c++)
			 {if (BUFSETMEM[varno+c]!=*(msg+c)) {stat=NOPASS;break;}}
			 crit +=5;     //crit-->OR/AND/0xaa
			}
		  else //compare with criteria
			{stat=comparespcode(msg,crit);
			 if (*(crit+2)==0xf5) numofbyte *=2;//logical sign
			 crit += 4+numofbyte;//crit-->OR(F7)/AND(F8)/CC
			}
		  break;

		 case 9://SLS
		  if (numofbyte==0)//compare with var
			{varno = (*(crit+4))*BYTEOFPVAR;stat=PASS;
			 if (BUFSETMEM[varno]!=*(bmsg+6)) {stat=NOPASS;break;}
			 crit +=5;     //crit-->OR/AND/0xaa
			}
		  else //compare with criteria
			{code=*(msg+6)&0x0f;
			 stat=compare(&code,crit+2,0);
			 if (*(crit+2)==0xf5) numofbyte *=2;//logical sign
			 crit += 4+numofbyte;//crit-->OR(F7)/AND(F8)/CC
			}
		  break;

		 case 10:  //CIC
		  stat=NOPASS;
		  msg=bmsg+7;          //msg-->cic
		  if (numofbyte==0)//compare with var
			{varno = (*(crit+4))*BYTEOFPVAR;stat=PASS;
			 if ((BUFSETMEM[varno]!=*msg)
				||(BUFSETMEM[varno+1]!= ((*(msg+1))&0x0f)) )
			  {stat=NOPASS;break;}
			 crit +=5;     //crit-->OR/AND/0xaa
			}
		  else //compare with criteria
			{temp=*(WORD *)msg;
		     cic[0]=LOBYTE(temp);cic[1]=HIBYTE(temp);
			 stat=compare(&cic[0],crit+2,0);
			 if (*(crit+2)==0xf5) numofbyte *=2;//logical sign
			  crit += 4+numofbyte;//crit-->OR(F7)/AND(F8)/CC
			}
		  break;

		 case 11: //MT
		  selecth1h0=0xff;
		  head=code=*(bmsg+9);  //get MT
		  stat=compare(&code,crit+2,0);
		  if (*(crit+2)==0xf5) numofbyte *=2;//logical sign
		  crit += 4+numofbyte;//crit-->OR(F7)/AND(F8)/CC
		  break;

		 default:stat=NOPASS; break;
	  }//switch
	}//if(fldno<=11)
	else//field>11
	{switch(head)
	{
		case 0x01://IAM
			switch(fldno)
			{
			case 23://23,$3.9,P42,过滤被叫号码
				msg=bmsg+17; //msg-->LI of CLDNO
				li=*msg++;  //msg-->ODD/EVEN of CLDNO
				li-=2;
				li*=2;
				if((*msg&0x80)!=0) li--;  //addr is odd
				msg+=2;  //msg-->1st addr
				stat=compareISUPaddr(msg,crit,li);
				break;

			case 40://3.10,P44,过滤主叫号码
				msg=bmsg+17; //msg-->LI of CLDNO
				li=*msg++;  //msg-->ODD/EVEN of CLDNO
				msg+=li;   //msg-->li of TNSN(if exist)
				stat=NOPASS;
				if(*msg==0x23) {msg++; li=*msg++; msg+=li;} //存在转接网选择
				if(*msg==0x01) msg+=8;  //存在呼叫参考
				if(*msg==0x0a)//存在主叫用户号码
				{msg++;  //msg-->LI of CLGPC
				 li=*msg++;  //msg-->ODD/EVEN of CLDNO
				 li-=2;
				 li*=8;
				 if((*msg&0x80)!=0) li-=4;  //addr is odd
				 msg+=2;  //msg-->1st addr
				 stat=compareISUPaddr(msg,crit,li);
				}//存在主叫用户号码
				break;
			default:break;
			}//switch
			break;
		case 0x04://INFO
			if(fldno!=25) {stat=NOPASS;break;}
//过滤主叫号码
			msg=bmsg+12;  //msg-->INFIN
			stat=NOPASS;
			if((*msg&0x03)==0x03)//存在主叫用户号码
			{if((*msg&0x20)==0x20) msg++;
			 msg+=3;  //msg-->li of CLGPC
			 li=*msg++;  //msg-->ODD/EVEN of CLDNO
			 li-=2;
			 li*=8;
			 if((*msg&0x80)!=0) li-=4;  //addr is odd
			 msg+=2;  //msg-->1st addr
			 stat=compareISUPaddr(msg,crit,li);
			}
			break;
		default:break;
	}//switch

	}//field>11

	 crit++;        //crit-->F7/F8/AA

	 if((stat!=PASS && *crit==0xf8)//the condition isn't pass & and
	  ||(stat==PASS && *crit==0xf7))//the condition is pass & or
		  break;
	 else if ((stat==PASS && *crit==0xf8)//condition is pass & OR
			  ||(stat!=PASS && *crit==0xf7))//condition isn't pass & AND
		  crit++;
  } while(*crit!=0xaa);
  return stat;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -