📄 decode.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 + -