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;我现在想求两个相反的函数。

解决方案 »

  1.   

    第一个没看明白第二个: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;
      

  2.   

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

  3.   

    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;
    }
      

  4.   

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

  5.   

    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
      

  6.   

    是啊,我就是在做短信的东西,楼上大哥,能不能给我点资料啊,尤其是你的那个UNIT
    [email protected]
      

  7.   

    这几天宿舍里上不了网,公司的机器上没那个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.
      

  8.   

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