zoukankan      html  css  js  c++  java
  • 关于SMS编码Delphi源码摘抄

    1.英文编码
    function Encode7bit(Src:String):String;
    var Dst:String;
        i:Integer;
        CurS,NextS:Byte;
        TStr:String;
    begin
      for i:=1 to Length(Src) do begin
        //当前是字符按8位分组的第8位,无需编码(8个字符已缩短为7个)
        if (i mod 8)=0 then Continue;
       
        //取当前位为数字
        TStr:=Copy(Src,i,1);
        CurS:=Ord(TStr[1]);

        //当前右移位组中的第一个字符不移位
        if (i mod 8)>1 then
          CurS:=(CurS shr ((i mod 8)-1) );

        //取后一位为数字如果到了字符的结束,不取
        if i<Length(Src) then begin
          TStr:=Copy(Src,i+1,1);
          NextS:=Ord(TStr[1]);
        end else
          NextS:=0;
        //后一位移位 左移
        NextS:=(NextS shl (8-(i mod 8)));

        //当前移位后加后一位移位后  转换成为十六进制
        Dst:=Dst+IntToHex(CurS+NextS,2);
      end;
      Result:=Dst;
    end;

    2、英文解码
    function Decode7bit(Src:String):String;
    var Dst:String;
        i:Integer;
        CurS,ProiS:Byte;
    begin
      for i:=1 to (Length(Src) div 2) do begin
        //将当前位的十六进制转换为十进制
        CurS:=StrToInt('$'+Copy(Src,(i-1)*2+1,2)); //32->50
        //取前一位十六进制转换为十进制
        if (i mod 7)<>1 then
          ProiS:=StrToInt('$'+Copy(Src,(i-2)*2+1,2)) //C8->200
        else
          ProiS:=0;
        //前一位右移,即将当前字符前移的位取出来
        if (i mod 7)>0 then
          ProiS:=(ProiS shr (9-(i mod 7)))
        else
          ProiS:=(ProiS shr 2);
        //当前位左移除掉高位
        if (i mod 7)>0 then
          CurS:=(CurS shl (i mod 7) )
        else
          CurS:=(CurS shl 7 );
        //将第八位设置为0
        CurS:=(CurS shr 1);
        Dst:=Dst+Chr(CurS+ProiS);
        //第七个十六进制内已包含有一个完整的字符
        if (i mod 7)=0 then begin
          CurS:=StrToInt('$'+Copy(Src,(i-1)*2+1,2)); //32->50
          CurS:=(CurS shr 1);
          Dst:=Dst+Chr(CurS);
        end;
      end;//en for
      Result:=Dst;
    end;

    3.中文编码
    function CnToUSC(var 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]);
        //BCD转换
        FmtStr(t,'%4.4X',[cur]); 
        Result:=Result+t;
        inc(i);
      end;
    end; 
     


    4、PDU解码
    function TForm1.DecodeChinese(SRC: String): string; //中文解码
    var
      i:Integer;
      S:String;
      D:WideChar;
      ResultW:WideString;
    begin
      for i:=1 to Round(Length(Src)/4) do
      begin
        S:=Copy(Src,(i-1)*4+1,4);
        D:=WideChar(StrToInt('$'+s)); //此处是重点,用delphi提供的widechar可以转换
       ResultW:=ResultW+D;
      end;
      Result:=ResultW;
    end;

  • 相关阅读:
    访问者模式
    oracle触发器简单实用示例
    C#控件交互效果类(也可以用作缩小面板放大,展示更多信息)
    23种设计模式探索C#
    windows快捷操作个人记录(常用)
    C#巧妙使用关键字async/await
    学习的枚举类型,结构以及初步了解数组
    目前学习.net时间让我摸不着头脑的事情
    对C#中几个循环语句的使用,请教
    学习了用控制台显示结果
  • 原文地址:https://www.cnblogs.com/xiaomaohai/p/6157405.html
Copyright © 2011-2022 走看看