Chinaunix首页 | 论坛 | 博客
  • 博客访问: 513705
  • 博文数量: 187
  • 博客积分: 3011
  • 博客等级: 中校
  • 技术积分: 2092
  • 用 户 组: 普通用户
  • 注册时间: 2009-06-28 17:08
文章分类

全部博文(187)

文章存档

2011年(1)

2010年(8)

2009年(178)

我的朋友

分类: LINUX

2009-12-08 22:41:12

手机短信息SMS开发—编码,解码
  1、 英文编码
  缺省的GSM字符集为7位编码,ASCII码为8位编码,编码就是将8位ASCII编码转换为7位编码。
  例如:1234 编码后得到31D98C06
  2进制表示
  8位编码 00110001 00110010 00110011 00110100
  7位编码 00110001 11011001 10001100 00000110
  通过例子可以看出,将ascii8位编码的Bit8去掉,依次将下7位编码的后几位逐次移到前面,形成新的8位编码。
  以下是C++Builder的实现代码:
  String __stdcall EncodeEnglish(String InputStr)
  {
   int n,len,cur;
   String tempstr,returnstr;
   unsigned char mid1[2],mid2[2];
   len=InputStr.Length();
   n=0;
   for(int i=1;i<=len;i++)
   {
   if (i   {
   strcpy(mid1,InputStr.SubString(i,1).c_str());
   strcpy(mid2,InputStr.SubString(i+1,1).c_str());
   cur=(mid1[0]>>n)|((mid2[0]<<(7-n))& 0xff);
   }
   else
   {
   strcpy(mid1,InputStr.SubString(i,1).c_str());
   cur=(mid1[0]>>n)& 0x7f;
   }
   FmtStr(tempstr,"%2.2X",ARRAYOFCONST((cur)));
   returnstr=returnstr+tempstr;
   n=(n+1)%7;
   if (n==0)
   i++;
   }
  return returnstr;
  }
  2、 英文解码
  简单地说就是将7位字符编码转换为8为字符编码
  以下是C++Builder的实现代码:
  int ReturnHex(int Value)
  {
   switch (Value)
   {
   case 0:
   Value=0x7f;
  
  break;
   case 1:
   Value=0x3f;
  
  break;
   case 2:
   Value=0x1f;
  
  break;
   case 3:
   Value=0x0f;
  
  break;
   case 4:
   Value=0x07;
  
  break;
   case 5:
   Value=0x03;
  
  break;
   case 6:
   Value=0x01;
  
  break;
   case 7:
   Value=0x00;
  
  break;
   }
   return Value;
  }
  String __stdcall DecodeEnglish (String InputStr)
  {
   unsigned char InStr[300];
   char OutStr[300];
   String str;
   int j=0,i=0;
   int Point=0;
   int temp;
   memset(InStr,0,301);
   memset(OutStr,0,301);
   for(int i=0;i   {
   str="0x"+InputStr.SubString(i+1,2);
   InStr[i/2]=StrToInt(str);
   }
   while(j<=InputStr.Length()/2)
   {
   if(Point==0)
   OutStr[i]=InStr[j]&ReturnHex(Point);
   else
  OutStr[i]=((InStr[j]&ReturnHex(Point))<>(8-Point));
   if(Point%7==0&&Point!=0)
   Point=0;
   else
   Point=Point+1;
   i++;
   j=i-(i/8);
   }
   OutStr[12]=((InStr[12]&0x07)<<5)|(InStr[11]>>(8-5));
   return AnsiString(OutStr);
  }
  3、 中文编码
  中文编码较为简单,就是将GB2312的中文编码转换为代码页为CP936的Unicode编码即可
  以下是C++Builder的实现代码
  String EncodeChinese(String InputStr)
  {
   int cur;
  String tempstr,returnstr;
  WideString ws;
  wchar_t mid[2];
  ws=WideString(InputStr);
  for(int i=1;i<=ws.Length();i++)
  {
  wcscpy(mid,ws.SubString(i,1).c_bstr());
  cur=mid[0];
  FmtStr(tempstr,"%4.4X",ARRAYOFCONST((cur)));
  returnstr=returnstr+tempstr;
  }
  return returnstr;
  }
  4、 中文解码
  将代码页为CP936的Unicode编码转换为GB2312的中文编码即可
  以下是C++Builder的实现代码
  String DecodeChinese(String InputStr)
  {
   wchar_t Buf[300];
   for(int i=0;i   {
   Buf[i/4]=StrToInt("0x"+InputStr.SubString(i+1,4));
   }
   Buf[InputStr.Length()/4]=0;
   return WideCharToString(Buf);
  }
  薛长宇
  changning@telekbird.com.cn
  2001-8-7
阅读(876) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~