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<InputStr.Length();i=i+2)
        {
                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))<<Point)|(InStr[j-1]>>(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);
}

解决方案 »

  1.   

    function ReturnHex(Value: Integer): Integer;
    begin
      case Value of
        0: Value := $7f;
        1: Value := $3f;
        2: Value := $1f;
        3: Value := $0f;
        4: Value := $07;
        5: Value := $03;
        6: Value := $01;
        7: Value := $00;
      end;
      Result := Value;
    end;function DecodeEnglish(InputStr: string): string;
    var
      InStr: array [0..300] of Byte;
      OutStr: array [0..300] of Char;
      str: string;
      i, j, Point, temp: Integer;
    begin
      i := 0; j := 0;
      Point := 0;
      FillChar(InStr, 301, #0);
      FillChar(OutStr, 301, #0);
      for i := 0 to Length(InputStr) - 1 do begin
        if Odd(i) then Continue;
        str := '0x' + Copy(InputStr, i+1, 2);
        InStr[i div 2] := StrToInt(str);
      end;
      i := 0;
      while (j <= Length(InputStr) div 2) do begin
        if Point = 0 then
          OutStr[i] := Chr(InStr[j] and ReturnHex(Point))
        else
          OutStr[i] := Chr(((InStr[j] and ReturnHex(Point)) shl Point) or (InStr[j-1] shr (8-Point)));
        if (Point mod 7 = 0) and (Point <> 0) then
          Point := 0
        else
          Point := Point + 1;
        i := i + 1;
        j := i - (i div 8);
      end;
      OutStr[12] := Chr(((InStr[12] and $07) shl 5) or (InStr[11] shr (8-5)));
      Result := AnsiString(OutStr);
    end;
      

  2.   

    十分多谢大家的支持。特别是sysu(死树)