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

📄 smsunicode.cpp

📁 for cdma short message decode, can support ascii or unicode
💻 CPP
字号:

#include <windows.h>
#include <string.h>
#include <iostream.h>
#include <stdio.h>
#include <stdlib.h>

#include "sms.h"


/*定义 unicode解码 数据结构*/
struct TYP_CODE
{
unsigned short qwcode;//机内码
unsigned short unicode;
};

TYP_CODE code_qw_unicode[24000];
TYP_CODE code_unicode_qw[24000];
int code_qwunicode_num = 0;


/*
//uincode 解码函数声明
int creat_code_table(char* FileName);
unsigned short unicode2qw_convert(unsigned short unicode_value);
unsigned short qw2unicode_convert(unsigned short qw_value);
void String_uni2qw_convert(void *ptr_unicode_string, unsigned char string_len);
void String_qw2Uni_convert(void *ptr_qw_string, int *str_uni_len);
void String_octet2ascii(char *ptr_string, int string_len);
void String_ascii2octet(char *ptr_string, int string_len);
*/


//创建文本编码转换表
int creat_code_table(char* FileName)
{
	FILE *fp;
	char file_line_buf[1024],path[1024];
	int i,j;
	unsigned short gb_value,unicode_value;
	
	memset(file_line_buf,0,1024);
	//strcpy(path,mms_file_default_path);
	strcpy(path, FileName);
	if(fp=fopen(path,"r"))
	{		
		j=0;
		while(!feof(fp))
			{
			i=0;
			while(!feof(fp))
				{
				file_line_buf[i]=fgetc(fp);
				if(file_line_buf[i]==0x0a)
					{
					if(file_line_buf[0]=='0')
						{
						if(file_line_buf[2]>='0'&&file_line_buf[2]<='9')
							gb_value=(file_line_buf[2]-'0')*4096;
						else
							{
							if(file_line_buf[2]>='a'&&file_line_buf[2]<='f')
								gb_value=(file_line_buf[2]-'a'+10)*4906;
							else gb_value=(file_line_buf[2]-'A'+10)*4906;
							}
						
						if(file_line_buf[3]>='0'&&file_line_buf[3]<='9')
							gb_value+=(file_line_buf[3]-'0')*256;
						else
							{
							if(file_line_buf[3]>='a'&&file_line_buf[3]<='f')
								gb_value+=(file_line_buf[3]-'a'+10)*256;
							else gb_value+=(file_line_buf[3]-'A'+10)*256;
							}

						if(file_line_buf[4]>='0'&&file_line_buf[4]<='9')
							gb_value+=(file_line_buf[4]-'0')*16;
						else
							{
							if(file_line_buf[4]>='a'&&file_line_buf[4]<='f')
								gb_value+=(file_line_buf[4]-'a'+10)*16;
							else gb_value+=(file_line_buf[4]-'A'+10)*16;
							}

						if(file_line_buf[5]>='0'&&file_line_buf[5]<='9')
							gb_value+=(file_line_buf[5]-'0');
						else
							{
							if(file_line_buf[5]>='a'&&file_line_buf[5]<='f')
								gb_value+=(file_line_buf[5]-'a'+10);
							else gb_value+=(file_line_buf[5]-'A'+10);
							}
						
						code_qw_unicode[j].qwcode=gb_value+0x8080;

						
						if(file_line_buf[9]>='0'&&file_line_buf[9]<='9')
							unicode_value=(file_line_buf[9]-'0')*4096;
						else
							{
							if(file_line_buf[9]>='a'&&file_line_buf[9]<='f')
								unicode_value=(file_line_buf[9]-'a'+10)*4906;
							else unicode_value=(file_line_buf[9]-'A'+10)*4906;
							}
						
						if(file_line_buf[10]>='0'&&file_line_buf[10]<='9')
							unicode_value+=(file_line_buf[10]-'0')*256;
						else
							{
							if(file_line_buf[10]>='a'&&file_line_buf[10]<='f')
								unicode_value+=(file_line_buf[10]-'a'+10)*256;
							else unicode_value+=(file_line_buf[10]-'A'+10)*256;
							}

						if(file_line_buf[11]>='0'&&file_line_buf[11]<='9')
							unicode_value+=(file_line_buf[11]-'0')*16;
						else
							{
							if(file_line_buf[11]>='a'&&file_line_buf[11]<='f')
								unicode_value+=(file_line_buf[11]-'a'+10)*16;
							else unicode_value+=(file_line_buf[11]-'A'+10)*16;
							}

						if(file_line_buf[12]>='0'&&file_line_buf[12]<='9')
							unicode_value+=(file_line_buf[12]-'0');
						else
							{
							if(file_line_buf[12]>='a'&&file_line_buf[12]<='f')
								unicode_value+=(file_line_buf[12]-'a'+10);
							else unicode_value+=(file_line_buf[12]-'A'+10);
							}
												
						code_qw_unicode[j].unicode=unicode_value;
						code_unicode_qw[j].unicode=code_qw_unicode[j].unicode;
						code_unicode_qw[j].qwcode=code_qw_unicode[j].qwcode;
						j++;						
						}
					break;
					}
				i++;
				}			
			}

		code_qwunicode_num=j;

		for(i=0;i<code_qwunicode_num;i++)
			{
			for(j=0;j<code_qwunicode_num-i-1;j++)
				{
				if(code_unicode_qw[j].unicode>code_unicode_qw[j+1].unicode)
					{
					unicode_value=code_unicode_qw[j].unicode;
					code_unicode_qw[j].unicode=code_unicode_qw[j+1].unicode;
					code_unicode_qw[j+1].unicode=unicode_value;
					gb_value=code_unicode_qw[j].qwcode;
					code_unicode_qw[j].qwcode=code_unicode_qw[j+1].qwcode;
					code_unicode_qw[j+1].qwcode=gb_value;
					}
				}
			}

		for(i=0;i<code_qwunicode_num;i++)
			{
			for(j=0;j<code_qwunicode_num-i-1;j++)
				{
				if(code_qw_unicode[j].qwcode>code_qw_unicode[j+1].qwcode)
					{
					unicode_value=code_qw_unicode[j].unicode;
					code_qw_unicode[j].unicode=code_qw_unicode[j+1].unicode;
					code_qw_unicode[j+1].unicode=unicode_value;
					gb_value=code_qw_unicode[j].qwcode;
					code_qw_unicode[j].qwcode=code_qw_unicode[j+1].qwcode;
					code_qw_unicode[j+1].qwcode=gb_value;
					}
				}
			}
		if(fp)fclose(fp);
	}
	else 
	{
		printf("\nERROR:cannot open gb2312.txt\n");
		return -1;
	}
	
	return 0;
}


//Unicode到内码的的转换,single symbol
unsigned short unicode2qw_convert(unsigned short unicode_value)
{
	int i=0, j=code_qwunicode_num-1;

	if(unicode_value<code_unicode_qw[i].unicode || unicode_value>code_unicode_qw[j].unicode)
		return 0;
	
	while((i+1)<j)
	{
		if(unicode_value==code_unicode_qw[i].unicode) return code_unicode_qw[i].qwcode;
		if(unicode_value==code_unicode_qw[j].unicode) return code_unicode_qw[j].qwcode;

		if(unicode_value==code_unicode_qw[i+(j-i)/2].unicode) return code_unicode_qw[i+(j-i)/2].qwcode;
		else
		{
			if(unicode_value<code_unicode_qw[i+(j-i)/2].unicode)    j=i+(j-i)/2;
			else i=i+(j-i)/2;
		}
	}

	if(unicode_value==code_unicode_qw[i].unicode) return code_unicode_qw[i].qwcode;
	else
	{
		if(unicode_value==code_unicode_qw[j].unicode) return code_unicode_qw[j].qwcode;
		else return 0;
	}
}


//内码到Unicode的转换,single symbol
unsigned short qw2unicode_convert(unsigned short qw_value)
	{
	int i=0,j=code_qwunicode_num-1;

	if(qw_value<code_qw_unicode[i].qwcode||qw_value>code_qw_unicode[j].qwcode)
		return 0;
	
	while((i+1)<j)
		{
		if(qw_value==code_qw_unicode[i].qwcode)return code_qw_unicode[i].unicode;
		if(qw_value==code_qw_unicode[j].qwcode)return code_qw_unicode[j].unicode;

		if(qw_value==code_qw_unicode[i+(j-i)/2].qwcode)return code_qw_unicode[i+(j-i)/2].unicode;
		else
			{
			if(qw_value<code_qw_unicode[i+(j-i)/2].qwcode)    j=i+(j-i)/2;
			else i=i+(j-i)/2;
			}
		}

	if(qw_value==code_qw_unicode[i].qwcode)return code_qw_unicode[i].unicode;
	else
		{
		if(qw_value==code_qw_unicode[j].qwcode)return code_qw_unicode[j].unicode;
		else return 0;
		}
	}

//unicode到内码的转换,string
void String_uni2qw_convert(void *ptr_unicode_string, unsigned char string_len)
	{
	unsigned char *p=(unsigned char *)ptr_unicode_string;
	int i=0,j=0;
	unsigned short temp_value;
	unsigned char temp_buf[160];
	
	while(i < string_len)
		{
			if(p[i] == 0)
				{
					i++;
					if(p[i] == 0)
						{
						temp_buf[j]=0;
						strcpy((char*)p, (char*)temp_buf);
						return ;
						}
					temp_buf[j++]=p[i++];
				}
			else 
				{
					temp_value=p[i]*256 + p[i+1];
					i += 2;
					temp_value=unicode2qw_convert(temp_value);
					temp_buf[j++]=temp_value/256;
					temp_buf[j++]=temp_value&0xff;
								
				}
			
			
		}
	temp_buf[j]=0;
	strcpy((char *)p, (char *)temp_buf);
	return;
}

//内码到unicode的转换,string
void String_qw2Uni_convert(void *ptr_qw_string, int *str_uni_len)
{
	unsigned char *p=(unsigned char *)ptr_qw_string;
	int i=0,j=0;
	unsigned short temp_value;
	unsigned char temp_buf[160];

	while(p[i]!=0)
		{
			if(p[i]<=0x7f)
				{
					temp_buf[j++]=0;
					temp_buf[j++]=p[i++];
				}
			else
				{
					if(p[i+1]>0x7f)
						{
							temp_value=p[i]*256+p[i+1];
							i+=2;
							temp_value=qw2unicode_convert(temp_value);
							temp_buf[j++]=temp_value/256;
							temp_buf[j++]=temp_value&0xff;				
						}
					else
						{
							temp_buf[j]=0;
							memcpy((char *)p, (char *)temp_buf, j);
							*str_uni_len = j;
							return;
						}
				}
		}

	temp_buf[j]=0;
	memcpy((char *)p, (char *)temp_buf, j);
	*str_uni_len = j;
	return;
}

void String_octet2ascii(char *ptr_string, int string_len)
{
	char charTemp[512];
	unsigned char temp = 0;
	int i = 0, j = 0;

	for(i = 0; i < string_len; i++)
		{
			temp = ptr_string[i]>>4;
			if(temp > 9)
				{
				charTemp[j++] = 'a' + temp -10;
				}
			else
				{
				charTemp[j++] = '0' + temp;
				}

			temp = ptr_string[i]&0xf;
			if(temp > 9)
				{
				charTemp[j++] = 'a' + temp -10;
				}
			else
				{
				charTemp[j++] = '0' + temp;
				}
		}
	
	strcpy(ptr_string, charTemp);
	return;
}

void String_ascii2octet(char *ptr_string, int string_len)
{
	char charTemp[512];
	int i = 0;

	for(i = 0; i < string_len; i++)
		{
			if((ptr_string[i] >= '0')&&(ptr_string[i] <= '9'))
				{
				charTemp[i/2] = (ptr_string[i] - '0')<<4;
				}
			else            //'a'-----'f'
				{
				charTemp[i/2] = (ptr_string[i] - 'a')<<4;
				}

			if((ptr_string[i+1] >= '0')&&(ptr_string[i+1] <= '9'))
				{
				charTemp[i/2] |= (ptr_string[i] - '0');
				}
			else            //'a'-----'f'
				{
				charTemp[i/2] |= (ptr_string[i] - 'a');
				}
		}
	
	strncpy(ptr_string, charTemp, i/2);
	return;
}

⌨️ 快捷键说明

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