CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
【经验总结】不能实施并行处理的情况 浅谈并行编程中的任务分解模式
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Delphi >  语言基础/算法/系统设计

操作字符串,求两个相反的函数。

楼主cjf1009(农民程序员)2004-11-25 17:14:54 在 Delphi / 语言基础/算法/系统设计 提问

1、缺省的GSM   字符集为7位编码,可以简单地理解为ASCII码(ASCII值小于80Hex,因此,Bit8被忽略),依次将下一7位编码的后几位逐次移至前面,形成新的8位编码,参见表2箭头指示。需要注意的是第9行,移位计数已达7位,则直接将本编码前加0。  
   
  function   Encode1(var   s:String):String;  
  var  
      i,j,len:Integer;  
      cur:Integer;  
      t:String;  
  begin  
      Result:='';  
      len:=Length(s);  
      //j   用于移位计数  
      i:=1;j:=0;  
      while   i<=len   do  
      begin  
          if   i<len   then  
          //数据变换  
              cur:=(ord(s[i])   shr   j)   or   ((ord(s[i+1])   shl   (7-j))   and   $ff)  
          else  
              cur:=(ord(s[i])   shr   j)   and   $7f;  
          FmtStr(t,'%2.2X',[cur]);  
          Result:=Result+t;  
          inc(i);  
  //移位计数达到7位的特别处理  
          j:=(j+1)   mod   7;  
          if   j=0   then   inc(i);  
  end;  
  end;  
   
  2、通过Delphi的WideString类型转换,可以巧妙地实现GB2312到Unicode的编码转换  
  function   TForm1.EncodeCn(s:   WideString):   string;  
  var  
      i,   len:   Integer;  
      cur:   Integer;  
      t:   string;  
  begin  
      Result   :=   '';  
      len   :=   Length(s);  
      i   :=   1;  
      while   i   <=   len   do  
          begin  
              cur   :=   ord(s[i]);  
              FmtStr(t,   '%4.4X',   [cur]);  
              Result   :=   Result   +   t;  
              inc(i);  
          end;  
  end;  
   
  我现在想求两个相反的函数。 问题点数:100、回复次数:17Top

1 楼lyguo(愚人(每天顶几顶挣分升星星)http://zz.ihenan.cn/map/)回复于 2004-11-25 18:16:13 得分 2

帮你顶Top

2 楼anbangs(大邦)回复于 2004-11-26 00:31:49 得分 2

upTop

3 楼ICMGDCHN(忘记感动)回复于 2004-11-26 09:02:54 得分 0

第一个没看明白  
   
  第二个:  
   
  Unicode2Chinese:  
   
  function   Unicode2Chinese(sUnicode:string):string;  
  var  
      i:integer;  
      sTemp:string;  
  begin  
      for   i:=0   to   Length(sUnicode)   do  
      begin  
          if   i   mod   4   =0   then  
          begin  
              sTemp:=copy(sUnicode,i-3,4);  
              sTemp:=WideChar(StrToIntDef('$'   +sTemp,   0));  
              Result:=Result+sTemp;  
          end;  
      end;  
  end;  
   
  Top

4 楼cjf1009(农民程序员)回复于 2004-11-26 09:04:37 得分 0

自己顶一下Top

5 楼cjf1009(农民程序员)回复于 2004-11-26 09:13:43 得分 0

第一个是pdu的编码函数,有一段这样的解释:  
   
  设需要发送的短消息内容为“Hi”,使用的GSM字符集为7位编码。首先将字符转换为7位的二进制,然后,将后面字符的位调用到前面,补齐前面的差别。例如:H翻译成1001000,i翻译成1101001,显然H的二进制编码不足八位,那么就将i的最后一位补足到H的前面。那么就成了11001000(C8),i剩下六位110100,前面再补两个0,变成00110100(34),于是“Hi”就变成了两个八进制数   C8   34。Top

6 楼cjf1009(农民程序员)回复于 2004-11-26 09:53:36 得分 0

我刚才查资料,有人说这个函数是不可逆的,这不可能吧Top

7 楼nyf1220(我是党员----不过听说最近风声紧,打算换名字)回复于 2004-11-26 09:56:38 得分 2

呵呵,比较繁,Top

8 楼ICMGDCHN(忘记感动)回复于 2004-11-26 10:52:59 得分 0

GSM解码:  
   
  int   gsmDecode7bit(const   unsigned   char*   pSrc,   char*   pDst,   int   nSrcLength)  
  {  
          int   nSrc;                 //   源字符串的计数值  
          int   nDst;                 //   目标解码串的计数值  
          int   nByte;               //   当前正在处理的组内字节的序号,范围是0-6  
          unsigned   char   nLeft;         //   上一字节残余的数据  
           
          //   计数值初始化  
          nSrc   =   0;  
          nDst   =   0;  
           
          //   组内字节序号和残余数据初始化  
          nByte   =   0;  
          nLeft   =   0;  
           
          //   将源数据每7个字节分为一组,解压缩成8个字节  
          //   循环该处理过程,直至源数据被处理完  
          //   如果分组不到7字节,也能正确处理  
          while(nSrc<nSrcLength)  
          {  
                  //   将源字节右边部分与残余数据相加,去掉最高位,得到一个目标解码字节  
                  *pDst   =   ((*pSrc   <<   nByte)   |   nLeft)   &   0x7f;  
                  //   将该字节剩下的左边部分,作为残余数据保存起来  
                  nLeft   =   *pSrc   >>   (7-nByte);  
           
                  //   修改目标串的指针和计数值  
                  pDst++;  
                  nDst++;  
           
                  //   修改字节计数值  
                  nByte++;  
           
                  //   到了一组的最后一个字节  
                  if(nByte   ==   7)  
                  {  
                          //   额外得到一个目标解码字节  
                          *pDst   =   nLeft;  
           
                          //   修改目标串的指针和计数值  
                          pDst++;  
                          nDst++;  
           
                          //   组内字节序号和残余数据初始化  
                          nByte   =   0;  
                          nLeft   =   0;  
                  }  
           
                  //   修改源串的指针和计数值  
                  pSrc++;  
                  nSrc++;  
          }  
           
          *pDst   =   0;  
           
          //   返回目标串长度  
          return   nDst;  
  }Top

9 楼cjf1009(农民程序员)回复于 2004-11-26 11:37:41 得分 0

楼上的,这个不是delphi的语法吧!!!我看不懂啊,能不能帮我翻译成delphi的?好人做到底嘛,你上面那个函数可以了。  
  Top

10 楼cjf1009(农民程序员)回复于 2004-11-26 13:35:07 得分 0

再顶Top

11 楼honglei520()回复于 2004-11-26 13:57:45 得分 2

okTop

12 楼ICMGDCHN(忘记感动)回复于 2004-11-26 14:45:16 得分 0

C语言的语法看不懂吗?晕倒  
  逐句翻译.  
   
  function   gsmDecode7bit(const   pSrc:pchar;pDst:pchar;nSrcLength:integer);  
  var  
      nSrc,nDst,nByte:integer;  
      nLeft:integer;  
  begin  
      nSrc:=0;  
      nDst:=0;  
   
      nByte:=0;  
      nLeft:=chr(0);  
   
      while   nSrc<nSrcLength   do  
      begin  
          pDst^:=chr(((ord(pSrc^)   shl   nByte)   or   nLeft)   and   $7F);  
          nLeft:=ord(pSrc^)   shr   (7-nByte);  
           
          inc(pDst);  
          inc(nDst);  
   
          inc(nByte);  
   
          if   nByte=7   then  
          begin    
              pDst^=chr(nLeft);  
              inc(pDst);  
              inc(nDst);  
   
              nByte:=0;  
              nLeft:=0;  
          end;  
          inc(pSrc);  
          inc(nSrc);  
      end;  
   
      pDst^:=chr(0);  
      result:=nDst;  
  end;  
   
  只是翻译过来,未经测试.  
   
  另:你是不是想写短信程序呀?我有个编解码的UNIT  
   
  Top

13 楼cjf1009(农民程序员)回复于 2004-11-27 13:42:56 得分 0

是啊,我就是在做短信的东西,楼上大哥,能不能给我点资料啊,尤其是你的那个UNIT  
  cjf1009@163.comTop

14 楼cjf1009(农民程序员)回复于 2004-11-29 09:55:46 得分 0

自己顶一下。Top

15 楼ICMGDCHN(忘记感动)回复于 2004-11-29 15:10:19 得分 92

这几天宿舍里上不了网,公司的机器上没那个UNIT  
   
  其实也没什么东西的,就是些编解码的函数而已.我发几个函数给你看下吧    
  function   HexCharToInt(HexToken   :   char):Integer;   //十六进制转整数  
  begin    
      {if   HexToken>#97   then   HexToken:=Chr(Ord(HexToken)-32);    
      {   use   lowercase   aswell   }    
   
      Result:=0;    
   
      if   (HexToken>#47)   and   (HexToken<#58)   then               {   chars   0....9   }    
            Result:=Ord(HexToken)-48    
      else   if   (HexToken>#64)   and   (HexToken<#71)   then     {   chars   A....F   }    
            Result:=Ord(HexToken)-65   +   10;    
  end;    
   
  function   HexCharToBin(HexToken   :   char):   string;   //十六进制转二进制  
  var   DivLeft   :   integer;    
  begin    
          DivLeft:=HexCharToInt(HexToken);       {   first   HEX->BIN   }    
          Result:='';    
                                                                                {   Use   reverse   dividing   }    
          repeat                                                           {   Trick;   divide   by   2   }    
              if   odd(DivLeft)   then                           {   result   =   odd   ?   then   bit   =   1   }    
                  Result:='1'+Result                           {   result   =   even   ?   then   bit   =   0   }    
              else    
                  Result:='0'+Result;    
   
              DivLeft:=DivLeft   div   2;               {   keep   dividing   till   0   left   and   length   =   4   }    
          until   (DivLeft=0)   and   (length(Result)=4);             {   1   token   =   nibble   =   4   bits   }    
  end;    
   
  function   HexToBin(HexNr   :   string):   string;    
  {   only   stringsize   is   limit   of   binnr   }    
  var   Counter   :   integer;    
  begin    
      Result:='';    
   
      for   Counter:=1   to   length(HexNr)   do    
          Result:=Result+HexCharToBin(HexNr[Counter]);    
  end;    
   
  function   pow(base,   power:   integer):   integer;   //乘方  
  var   counter   :   integer;    
  begin    
      Result:=1;    
   
      for   counter:=1   to   power   do    
          Result:=Result*base;    
  end;    
   
  function   BinStrToInt(BinStr   :   string)   :   integer;   //二进制转INT  
  var   counter   :   integer;    
  begin    
      if   length(BinStr)>16   then    
          raise   ERangeError.Create(#13+BinStr+#13+    
                          'is   not   within   the   valid   range   of   a   16   bit   binary.'+#13);    
   
      Result:=0;    
   
      for   counter:=1   to   length(BinStr)   do    
              if   BinStr[Counter]='1'   then    
                  Result:=Result+pow(2,length(BinStr)-counter);    
  end;    
   
  function   DecodeSMS7Bit(PDU   :   string):string;   //SMS解码  
  var   OctetStr   :   string;    
          OctetBin   :   string;    
          Charbin     :   string;    
          PrevOctet:   string;    
          Counter     :   integer;    
          Counter2   :   integer;    
  begin    
      PrevOctet:='';    
      Result:='';    
   
      for   Counter:=1   to   length(PDU)   do    
          begin    
              if   length(PrevOctet)>=7   then           {   if   7   Bit   overflow   on   previous   }    
                  begin    
                      if   BinStrToInt(PrevOctet)<>0   then    
                          Result:=Result+Chr(BinStrToInt(PrevOctet))    
                      else   Result:=Result+'   ';    
   
                      PrevOctet:='';    
                  end;    
   
              if   Odd(Counter)   then                         {   only   take   two   nibbles   at   a   time   }    
                  begin    
                      OctetStr:=Copy(PDU,Counter,2);    
                      OctetBin:=HexToBin(OctetStr);    
   
                      Charbin:='';    
                      for   Counter2:=1   to   length(PrevOctet)   do    
                          Charbin:=Charbin+PrevOctet[Counter2];    
   
                      for   Counter2:=1   to   7-length(PrevOctet)   do    
                          Charbin:=OctetBin[8-Counter2+1]+Charbin;    
   
                      if   BinStrToInt(Charbin)<>0   then   Result:=Result+Chr(BinStrToInt(CharBin))    
                          else   Result:=Result+'   ';    
   
                      PrevOctet:=Copy(OctetBin,1,length(PrevOctet)+1);    
                  end;    
          end;    
  end;    
   
  function   ReverseStr(SourceStr   :   string)   :   string;   //字符串反转  
  var   Counter   :   integer;    
  begin    
      Result:='';    
   
      for   Counter:=1   to   length(SourceStr)   do    
          Result:=SourceStr[Counter]+Result;    
  end;    
   
  end.Top

16 楼ICMGDCHN(忘记感动)回复于 2004-11-29 15:17:34 得分 0

http://www.delphifans.com/SoftView/SoftView_131.html  
   
  这里有串口相关的源码Top

17 楼cjf1009(农民程序员)回复于 2004-11-30 10:21:05 得分 0

ok了,揭贴。Top

相关问题

  • 寻字符串操作函数!
  • 关于字符串函数的操作
  • 字符串函数?
  • 字符串函数
  • pb中有那些对字符串操作的函数??
  • 请假一个字符串操作函数
  • 函数指针问题,可以用字符串操作吗?
  • 为什么字符串操作Trim()这个函数用不了
  • ATL & ANSI字符串函数
  • 字符串比较函数

关键词

  • c++
  • 编码
  • 数值
  • 指针
  • 修改
  • charbin
  • prevoctet
  • hextoken
  • counter
  • binstrtoint

得分解答快速导航

  • 帖主:cjf1009
  • lyguo
  • anbangs
  • nyf1220
  • honglei520
  • ICMGDCHN

相关链接

  • Delphi类图书
  • Delphi类源码下载
  • Delphi控件下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
惹火投票。。火热进行中...
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
CSDN网站24小时值班电话:13552009689
Copyright © 2000-2009, CSDN.NET, All Rights Reserved
GongshangLogo