📄 smspdu.c
字号:
|| (((dcs>>4)&15)==15 && ((dcs>>2)&1)==1) ) {*/ } else { //all encodings of 8bit data or unknown things if ((pdutype>>6)&1){ strcpy(ud,pdu+where+2+(udh_length*2)); } else { strcpy(ud,pdu+where); } } } /* * SMS values to readable text */ if ((pdutype&3)==1) { sprintf(&result[strlen(result)],"To: %s\n",oa.number); } else { sprintf(&result[strlen(result)],"From: %s\n",oa.number); } switch (pdutype&27) { case (0<<3)+1: //VP not present break; case (1<<3)+1: //VP enhanced break; case (2<<3)+1: //VP relative if (0<=atoi(scts) && atoi(scts)<=143) { sprintf(temp,"%d minute(s)",atoi(scts)*5); } else if (144<=atoi(scts) && atoi(scts)<=167) { sprintf(temp,"%d minute(s)",(12*60)+((atoi(scts)-143)*30)); } else if (168<=atoi(scts) && atoi(scts)<=196) { sprintf(temp,"%d day(s)",atoi(scts)-166); } else if (197<=atoi(scts) && atoi(scts)<=255) { sprintf(temp,"%d week(s)",atoi(scts)-192); } sprintf(&result[strlen(result)],"Valid for: %s\n",temp); break; case (3<<3)+1: //VP absolute sprintf(&result[strlen(result)],"Valid until: %s\n",scts); break; case 0: //Service Center Time Stamp (SCTS) sprintf(&result[strlen(result)],"Date: %s\n",scts); break; } if (sca.length) { sprintf(&result[strlen(result)],"SMSC number: %s\n",sca.number); } else { sprintf(&result[strlen(result)],"SMSC number: N/A\n"); } sprintf(&result[strlen(result)],"PDU type: "); if ((pdutype&3)==0) { sprintf(&result[strlen(result)],"SMS-DELIVER "); } else if ((pdutype&3)==1) { sprintf(&result[strlen(result)],"SMS-SUBMIT "); } if ((pdutype>>7)&1) { sprintf(&result[strlen(result)],"ReplyPath "); } if ((pdutype>>6)&1) { sprintf(&result[strlen(result)],"UDHI "); } if ((pdutype>>5)&1) { if ((pdutype&3)==0) { sprintf(&result[strlen(result)],"SRI "); } else if ((pdutype&3)==1) { sprintf(&result[strlen(result)],"SRR "); } } if ((pdutype>>2)&1) { if ((pdutype&3)==0) { sprintf(&result[strlen(result)],"MMS "); } else if ((pdutype&3)==1) { sprintf(&result[strlen(result)],"RejectDuplicate "); } } sprintf(&result[strlen(result)],"\nData Coding Scheme: "); if (((dcs>>6)&3)==0 || ((dcs>>6)&3)==1) { if (dcs>>5) { sprintf(&result[strlen(result)],"compressed "); } switch ((dcs>>2)&3) { case 0: sprintf(&result[strlen(result)],"7bit-GSM "); break; case 1: sprintf(&result[strlen(result)],"8bit "); break; case 2: sprintf(&result[strlen(result)],"16bit-UCS2 "); break; case 3: //reserved value break; } if (dcs>>4) { sprintf(&result[strlen(result)],"(Class %d)",dcs&3); } if (((dcs>>6)&3)==1) { sprintf(&result[strlen(result)]," marked as auto-delete"); } } else if (((dcs>>6)&3)==3) { if (((dcs>>4)&3)==3) { if ((dcs>>2)) { sprintf(&result[strlen(result)],"8bit "); } else { sprintf(&result[strlen(result)],"7bit-GSM "); } if (dcs>>4) { sprintf(&result[strlen(result)],"(Class %d)",dcs&3); } } else { if (((dcs>>4)&3)==0) { sprintf(&result[strlen(result)],"discarded 7bit-GSM, "); } else if (((dcs>>4)&3)==1) { sprintf(&result[strlen(result)],"stored 7bit-GSM, "); } else if (((dcs>>4)&3)==2) { sprintf(&result[strlen(result)],"stored 16bit-UCS2, "); } if ((dcs>>3)&1) { sprintf(&result[strlen(result)],"active "); } else { sprintf(&result[strlen(result)],"inactive "); } switch (dcs&3) { case 0: sprintf(&result[strlen(result)],"voicemail message waiting "); break; case 1: sprintf(&result[strlen(result)],"fax message waiting "); break; case 2: sprintf(&result[strlen(result)],"e-mail message waiting "); break; case 3: sprintf(&result[strlen(result)],"??? message waiting "); break; } sprintf(&result[strlen(result)],"indication "); } } else { sprintf(&result[strlen(result)],"Warning, reserved value %d was used", dcs); } sprintf(&result[strlen(result)],"\n"); sprintf(&result[strlen(result)],"Message length: %d\n",udl); if (udh_length) { sprintf(&result[strlen(result)],"Message Header:\n"); where=0; do{ where+=2; switch (hexstr2int(udh+where-2,2)) { case 0: //multipart message (8bit sequence) sprintf(&result[strlen(result)],"\tMultipart message: "); where+=2; if (hexstr2int(udh+where-2,2)==3) { sprintf(&result[strlen(result)],"sequence number=%d, part %d of %d", hexstr2int(udh+where,2), hexstr2int(udh+where+4,2), hexstr2int(udh+where+2,2)); where+=6; } else { sprintf(&result[strlen(result)],"...Error: incorrect length (%d), ",hexstr2int(udh+where-2,2)); for (i=0;i<(hexstr2int(udh+where-2,2)*2);i+=2) { sprintf(&result[strlen(result)],"0x%c%c ",udh[where],udh[where+1]); where+=2; } } break; case 8: //multipart message (16bit sequence) sprintf(&result[strlen(result)],"\tMultipart message: "); where+=2; if (hexstr2int(udh+where-2,2)==4) { sprintf(&result[strlen(result)],"sequence number=%d, part %d of %d", hexstr2int(udh+where,4), hexstr2int(udh+where+6,2), hexstr2int(udh+where+4,2)); where+=8; } else { sprintf(&result[strlen(result)],"...Error: incorrect length (%d), ",hexstr2int(udh+where-2,2)); for (i=0;i<(hexstr2int(udh+where-2,2)*2);i+=2) { sprintf(&result[strlen(result)],"0x%c%c ",udh[where],udh[where+1]); where+=2; } } break; case 1: //special sms indication sprintf(&result[strlen(result)],"\tIndications: "); where+=2; if (hexstr2int(udh+where-2,2)==2) { if ((hexstr2int(udh+where,2)&128)==128) { sprintf(&result[strlen(result)],"store"); } else { sprintf(&result[strlen(result)],"discard"); } switch (hexstr2int(udh+where,2)&3) { case 0: //voice sprintf(&result[strlen(result)],", voicemail message waiting"); break; case 1: //fax sprintf(&result[strlen(result)],", fax message waiting"); break; case 2: //electronic mail sprintf(&result[strlen(result)],", e-mail message waiting"); break; case 3: //specified as "other" default: sprintf(&result[strlen(result)],", ??? message waiting"); break; } sprintf(&result[strlen(result)],", message count=%d",hexstr2int(udh+where+2,2)); where+=4; } else { sprintf(&result[strlen(result)],"...Error: incorrect length (%d), ",hexstr2int(udh+where-2,2)); for (i=0;i<(hexstr2int(udh+where-2,2)*2);i+=2) { sprintf(&udh[strlen(udh)],"0x%c%c ",udh[where],udh[where+1]); where+=2; } } break; case 4: //application port addressing 8bit address sprintf(&result[strlen(result)],"\tApplication port: "); where+=2; if (hexstr2int(udh+where-2,2)==2) { sprintf(&result[strlen(result)],"destination port=%d, originator port: %d", hexstr2int(udh+where,2), hexstr2int(udh+where+2,2)); where+=4; break; } else { sprintf(&result[strlen(result)],"...Error: incorrect length (%d), ",hexstr2int(udh+where-2,2)); for (i=0;i<(hexstr2int(udh+where-2,2)*2);i+=2) { sprintf(&udh[strlen(udh)],"0x%c%c ",udh[where],udh[where+1]); where+=2; } } break; case 5: //application port addressing 16bit address sprintf(&result[strlen(result)],"\tApplication port: "); where+=2; if (hexstr2int(udh+where-2,2)==4) { sprintf(&result[strlen(result)],"destination port=%d, originator port: %d", hexstr2int(udh+where,4), hexstr2int(udh+where+4,4)); where+=8; break; } else { sprintf(&result[strlen(result)],"...Error: incorrect length (%d), ",hexstr2int(udh+where-2,2)); for (i=0;i<(hexstr2int(udh+where-2,2)*2);i+=2) { sprintf(&udh[strlen(udh)],"0x%c%c ",udh[where],udh[where+1]); where+=2; } } break; case 7: //UDH source indicator sprintf(&result[strlen(result)],"\tThe following headers were created by the "); where+=2; if (hexstr2int(udh+where-2,2)==1) { switch (hexstr2int(udh+where,2)){ case 0: sprintf(&result[strlen(result)],"sending unit"); break; case 1: sprintf(&result[strlen(result)],"receiving unit"); break; case 2: sprintf(&result[strlen(result)],"SMSC"); break; default: sprintf(&result[strlen(result)],"...Error: unknown value %d",hexstr2int(udh+where,2)); break; } where+=2; } else { sprintf(&result[strlen(result)],"...Error: incorrect length (%d), ",hexstr2int(udh+where-2,2)); for (i=0;i<(hexstr2int(udh+where-2,2)*2);i+=2) { sprintf(&udh[strlen(udh)],"0x%c%c ",udh[where],udh[where+1]); where+=2; } } break; case 9: // wireless control message protocol sprintf(&result[strlen(result)],"\tWCMP data unit: "); where+=2; for (i=0;i<(hexstr2int(udh+where-2,2)*2);i+=2) { sprintf(&udh[strlen(udh)],"0x%c%c ",udh[where],udh[where+1]); where+=2; } break; case 0x70: case 0x71: case 0x72: case 0x73: case 0x74: case 0x75: case 0x76: case 0x77: case 0x78: case 0x79: case 0x7a: case 0x7b: case 0x7c: case 0x7d: case 0x7e: case 0x7f: // SIM toolkit security header sprintf(&result[strlen(result)],"\tSIM toolkit security header:"); where+=2; if (hexstr2int(udh+where-2,2)!=0) { sprintf(&result[strlen(result)]," ...Error: incorrect length (%d), ",hexstr2int(udh+where-2,2)); for (i=0;i<(hexstr2int(udh+where-2,2)*2);i+=2) { sprintf(&udh[strlen(udh)],"0x%c%c ",udh[where],udh[where+1]); where+=2; } } break; default: //unknown header type sprintf(&result[strlen(result)],"\tUnknown type (%02X): ",hexstr2int(udh+where-2,2)); where+=2; for (i=0;i<(hexstr2int(udh+where-2,2)*2);i+=2) { sprintf(&udh[strlen(udh)],"0x%c%c ",udh[where],udh[where+1]); where+=2; } break; } sprintf(&result[strlen(result)],"\n"); } while (where<strlen(udh)); } if (udl && ((((dcs>>6)&3)==0 && ((dcs>>2)&3)==0) // 00xx x00x (GSM-7bit) || (((dcs>>6)&3)==1 && ((dcs>>2)&3)==0) // 01xx x00x (GSM-7bit) || (((dcs>>4)&15)==12) // 1100 xxxx (GSM-7bit) || (((dcs>>4)&15)==13) // 1101 xxxx (GSM-7bit) || (((dcs>>4)&15)==15 && ((dcs>>2)&1)==0) // 1111 xxxx (GSM-7bit) || (((dcs>>6)&3)==0 && ((dcs>>2)&3)==2) //00xx x10x (UCS2) || (((dcs>>6)&3)==1 && ((dcs>>2)&3)==2) //01xx x10x (UCS2) || (((dcs>>4)&15)==14) // 1110 xxxx (UCS2) )) { sprintf(&result[strlen(result)],"Message:\n%s\n",ud); } else if (udl) { sprintf(&result[strlen(result)],"Message (as hexstring):\n%s\n",ud); } memset(pdu,0,1); sprintf(pdu,"%s",result);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -