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

📄 decode.c~

📁 在linux中
💻 C~
字号:
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <iconv.h>int get_message(const char *pdu,char *time,char *phone,char *msg);int msg_dealwith(const char *msg,char *unicode);int main(int argc,char *argv[]){	//char pdu[] = "0891683108100005F0240D91685121004572F0000880210191342323044F60597D";	char pdu[] = "0891683108100005F0040D91685121004903F10008802101022262230A6211662F4F6059277237";	char time[13];	char phone[14];	char msg[256];	memset(msg,0,sizeof(msg));	memset(phone,0,sizeof(phone));	memset(time,0,sizeof(time));	if(-1 == get_message(pdu,time,phone,msg)){		printf("convert failed.\n");		return EXIT_FAILURE;	}	printf("time:%s\n",time);	printf("phone:%s\n",phone);	printf("msg:%s\n",msg);			return EXIT_SUCCESS;}/*将接收到的PDU字符串进行解码,求出时间、对方号码以及短信内容(将UCS2编码格式转换成utf-8格式)pdu:接收到的PDU字符串time:时间,格式为“年/月/日,时:分:秒”phone:发送方的手机号码,格式为“86XXXXXXXXXXX”,总共11位(不算“86”)msg:短信内容,已经转换为utf-8格式转换成功则返回0;否则返回-1*/int get_message(const char *pdu,char *time,char *phone,char *msg){	int i;	char dump;		/* 获取并处理时间 */	char my_time[13];	memset(my_time,0,sizeof(my_time));	strncpy(my_time,pdu+42,12);		for(i = 0; i < 12; i += 2){		dump = my_time[i];		my_time[i] = my_time[i+1];		my_time[i+1] = dump;	}	sprintf(time,"%c%c/%c%c/%c%c,%c%c:%c%c:%c%c",my_time[0],my_time[1],my_time[2],my_time[3],my_time[4],my_time[5],my_time[6],my_time[7],my_time[8],my_time[9],my_time[10],my_time[11]);			/* 获取手机号码 */	char my_phone[15];	memset(my_phone,0,sizeof(my_phone));	strncpy(my_phone,pdu+24,14);		for(i = 0; i < 14; i += 2){		dump = my_phone[i];		my_phone[i] = my_phone[i+1];		my_phone[i+1] = dump;	}		strncpy(phone,my_phone,13);			/* 获取短信内容 */	char num_str[3];	int num;	num_str[0] = pdu[56];	num_str[1] = pdu[57];	num_str[2] = 0;	sscanf(num_str,"%X",&num);		char my_msg[256];	memset(my_msg,0,sizeof(my_msg));	strncpy(my_msg,pdu+58,num*2);		///////////////////////////////////////	printf("my_msg:%s\n",my_msg);	//////////////////////////////////////		/* 转换成utf-8格式并复制到msg中 */	return msg_dealwith(my_msg,msg);}/*将UCS2字符串转换成utf-8格式的字符串* unicode:短信息,UCS2字符串* msg:utf-8格式的字符串,要求该缓冲区的长度足够长** 转换成功,则返回0,否则返回-1*/int msg_dealwith(const char *unicode,char *msg){	/* 将字符串的unicode转换为数字 */	char unistr[3];	char uninum[256];	int i,unilen = strlen(unicode);	memset(uninum,0,sizeof(uninum));	for(i = 0; i < unilen; i += 2){		unistr[0] = unicode[i];		unistr[1] = unicode[i+1];		unistr[2] = 0;		sscanf(unistr,"%X",&uninum[i/2]);	}		/* 将unicode转换为utf-8代码,保存在out_msg中 */	char *inbuf = uninum;						//输入缓冲区指针	unsigned int insize = strlen(inbuf);	//在输入编码(fromcode)下所占用的字节数		char out_msg[256];							//保存输出码(tocode)	memset(out_msg,0,sizeof(out_msg));	char *outbuf = out_msg;						//输出缓冲区指针	unsigned int outsize = sizeof(out_msg);				//输出缓冲区长度	unsigned int avail = outsize;				//记录输出缓冲区剩余空间长度		iconv_t cd;	cd=iconv_open("UTF-8","UCS-2BE");   	//将字符串编码由UCS-2转换为utf-8	if(cd == (iconv_t)(-1)){		return -1;	}	if((size_t)(-1) == iconv(cd,&inbuf,&insize,&outbuf,&avail)){		return -1;	}	iconv_close(cd);			/* 将转换后的内容复制到msg中 */	strncpy(msg,out_msg,outsize-avail);		return 0;}

⌨️ 快捷键说明

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