这是一段加密代码,请帮我改成C#版的,谢谢……function myenctstr(const s:string; skey:string):string;
var
    i,j: integer;
    hexS,hexskey,midS,tmpstr:string;
    a,b,c:byte;
begin
    hexS   :=myStrtoHex(s);
    hexskey:=myStrtoHex(skey);
    midS   :=hexS;
    for i:=1 to (length(hexskey) div 2)   do
    begin
        if i<>1 then midS:= tmpstr;
        for j:=1 to (length(midS) div 2) do
        begin
            a:=strtoint('$'+midS[2*j-1]+midS[2*j]);
            showmessage(inttostr(a));
            b:=strtoint('$'+hexskey[2*i-1]+hexskey[2*i]);
            c:=a xor b;
            tmpstr := tmpstr+myStrtoHex(chr(c));
        end;
    end;
    result := tmpstr;
end;

解决方案 »

  1.   

    //这个代码简化成这样function StrToHex( //字符串处理成十六进制字符串
      mStr: string //字符串
    ): string; //返回处理后的十六进制字符串
    var
      I: Integer;
    begin
      Result := '';
      for I := 1 to Length(mStr) do
        Result := Format('%s%.2x', [Result, Ord(mStr[I])]);
    end; { StrToHex }function myenctstr(S: string; sKey: string): string;
    var
      I, J: Integer;
    begin
      Result := '';
      for I := 1 to Length(sKey) do
      begin
        if I <> 1 then S := Result;
        for J := 1 to Length(S) do
          Result := Result + Char(Ord(sKey[I]) xor Ord(S[J]));
      end;
      Result := StrToHex(Result);
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      Memo1.Text := myenctstr('说实话这代码写得很难看', 'Zswang');
    end;
      

  2.   

    兄弟,你简化的这个函数不对myenctstr,加密结果跟我的不同。而且我需要的是C#代码,你能帮我改为C#的吗?
      

  3.   

    你看这样可以 。。有错的话不好意思
    public string myenctstr(string s,string skey)
    {
     string  hexS,hexskey,midS,tmpstr;
     byte  a,b,c;
     hexS=myStrtoHex(s);
     hexskey=myStrtoHex(skey);
     midS=hexS;
    for(int i=1;i<length(hexskey)/2;i++)
    {
      if(i!=1)
      {
        midS= tmpstr;
      }
      for(int j=1;length(midS)/2;i++)
      {
                a=Convert.ToInt32('$'+midS[2*j-1]+midS[2*j]);
               // showmessage(inttostr(a));
                b=Convert.ToInt32('$'+hexskey[2*i-1]+hexskey[2*i]);
                c=a^b;
                tmpstr= tmpstr+myStrtoHex(chr(c));
       }
     }
     result = tmpstr;
     retuen result
    }
      

  4.   

    除非myStrtoHex不是标准的
    你把myStrtoHex的代码贴出来Memo1.Text := myenctstr('说实话这代码写得很难看', 'Zswang');结果:
    91EF90EFE1EA8FB8EEA098B18AEEEF99E0869E8BE5EEE29CE39C9299FCCB9DD3EBC2F99D9CEA93F5EDF8969DE698E798969DF8CF99D7EFC6FD9998EE97F1E9FC929995EB94EBE5EE8BBCEAA49CB58EEAEB9DE4829A8FE1EAF08EF18E808BEED98FC1F9D0EB8F8EF881E7FFEA848F83FD82FDF3F89DAAFCB28AA398FCFD8BF2948C99F7FC87F986F9F7FC99AEF8B68EA79CF8F98FF690889DF3F8F48AF58A848FEADD8BC5FDD4EF8B8AFC85E3FBEE808BFF81FE818F84E1D680CEF6DFE48081F78EE8F0E58B808CF28DF2FCF792A5F3BD85AC97F3F284FD9B8396F8F388F689F6F8F396A1F7B981A893F7F680F99F8792FCF7FB85FA858B80E5D284CAF2DBE08485F38AECF4E18F849EE09FE0EEE580B7E1AF97BE85E1E096EF899184EAE1ED93EC939D96F3C492DCE4CDF69293E59CFAE2F79992E997E8979992F7C096D8E0C9F29697E198FEE6F39D969AE49BE4EAE184B3E5AB93BA81E5E492EB8D9580EEE5F688F788868DE8DF89C7FFD6ED8988FE87E1F9EC828985FB84FBF5FE9BACFAB48CA59EFAFB8DF4928A9FF1FA81FF80FFF1FA9FA8FEB088A19AFEFF89F0968E9BF5FEF28CF38C8289ECDB8DC3FBD2E98D8CFA83E5FDE8868D97E996E9E7EC89BEE8A69EB78CE8E99FE680988DE3E8E49AE59A949FFACD9BD5EDC4FF9B9AEC95F3EBFE909BE09EE19E909BFEC99FD1E9C0FB9F9EE891F7EFFA949F93ED92EDE3E88DBAECA29AB388ECED9BE2849C89E7EC98E699E6E8E386B1E7A991B883E7E690E98F9782ECE7EB95EA959B90F5C294DAE2CBF09495E39AFCE4F19F94EF91EE919F94F1C690DEE6CFF49091E79EF8E0F59B909CE29DE2ECE782B5E3AD95BC87E3E294ED8B9386E8E3F987F8878982E7D086C8F0D9E28687F188EEF6E38D868AF48BF4FAF194A3F5BB83AA91F5F482FB9D8590FEF58EF08FF0FEF590A7F1BF87AE95F1F086FF998194FAF1FD83FC838D86E3D482CCF4DDE68283F58CEAF2E78982
      

  5.   

    //比我想象的复杂点
    //不太清楚TList怎么简单复制,我目前是通过循环复制
    //楼主如果你简化了代码也别忘记贴出来
    //这贴花了不少时间-_-!!!        public string StrToHex(List<byte> mStr) //返回处理后的十六进制字符串
            {
                string vReturn = "";
                foreach (char Value in mStr)
                    vReturn += ((byte)Value).ToString("X2");
                return vReturn;
            }
            public string myenctstr(string S, string sKey)
            {
                Encoding utf8 = Encoding.UTF8;
                Encoding gb2312 = Encoding.GetEncoding("GB2312");            byte[] vSBytes = Encoding.Convert(utf8, gb2312, Encoding.UTF8.GetBytes(S));
                byte[] vKBytes = Encoding.Convert(utf8, gb2312, Encoding.UTF8.GetBytes(sKey));            List<byte> vReturn = new List<byte>();
                List<byte> vTemp = new List<byte>();
                foreach (byte B in vSBytes) 
                    vTemp.Add(B);
                foreach (byte vKByte in vKBytes)
                {
                    if (vReturn.Count != 0)
                    {
                        vTemp.Clear();
                        foreach (byte B in vReturn)
                            vTemp.Add(B);
                    }
                    foreach (char vChar in vTemp)
                        vReturn.Add((byte)(vKByte ^ vChar));
                }
                return StrToHex(vReturn);
            }
            private void button5_Click(object sender, EventArgs e)
            {
                textBox1.Text = myenctstr("说实话这代码写得很难看", "Zswang");
            }
      

  6.   

    Delphi中默认使用的是Ansi编码
    也就是GB2312上面的转化先处理了一道
    楼主也可以把加密前后的结果贴出来以便调试确认
      

  7.   

    zswang:你好!
    你简化的那段Delphi代码结果跟我的是相同。但是你的C#代码中间有一段编译通不过,你能再帮我看下吗?谢谢……
    public string myenctstr(string s,string skey)
    {
    string  hexS,hexskey,midS,tmpstr;
    byte  a,b,c;
    hexS=myStrtoHex(s);
    hexskey=myStrtoHex(skey);
    midS=hexS;
    for(int i=1;i<= hexskey.Length/2;i++)
    {
    if(i!=1)
    {
    midS= tmpstr;
    }
    for(int j=1;j<=midS.Length/2;i++)
    {
                        //无法将类型“int”隐式转换为“byte”
    a=Convert.ToInt32('$'+midS[2*j-1]+midS[2*j]);
    b=Convert.ToInt32('$'+hexskey[2*i-1]+hexskey[2*i]);
    c=a^b;                     //名称“chr”在类或命名空间“WebApplication1.WebForm2”中不存在
    tmpstr= tmpstr+myStrtoHex(chr(c));
    }
    }
    return  tmpstr;
    }
      

  8.   

    我给你的C#代码是那句出问题了?
    我是在2005中调试通过的(Win32程序)
      

  9.   

    下面的注释就是错误提示:  a=Convert.ToInt32('$'+midS[2*j-1]+midS[2*j]);//无法将类型“int”隐式转换为“byte”
      b=Convert.ToInt32('$'+hexskey[2*i-1]+hexskey[2*i]);//无法将类型“int”隐式转换为“byte”
      c=a^b;//无法将类型“int”隐式转换为“byte”
      
      tmpstr= tmpstr+myStrtoHex(chr(c));//名称“chr”在类或命名空间“WebApplication1.WebForm2”中不存在
      

  10.   

    ....这是我给你的代码吗?...... zswang(伴水清清)(专家门诊清洁工) ( ) 信誉:100    Blog  2007-1-28 23:37:27  得分: 0  
    //比我想象的复杂点
    //不太清楚TList怎么简单复制,我目前是通过循环复制
    //楼主如果你简化了代码也别忘记贴出来
    //这贴花了不少时间-_-!!!        public string StrToHex(List<byte> mStr) //返回处理后的十六进制字符串
            {
                string vReturn = "";
                foreach (char Value in mStr)
                    vReturn += ((byte)Value).ToString("X2");
                return vReturn;
            }
            public string myenctstr(string S, string sKey)
            {
                Encoding utf8 = Encoding.UTF8;
                Encoding gb2312 = Encoding.GetEncoding("GB2312");            byte[] vSBytes = Encoding.Convert(utf8, gb2312, Encoding.UTF8.GetBytes(S));
                byte[] vKBytes = Encoding.Convert(utf8, gb2312, Encoding.UTF8.GetBytes(sKey));            List<byte> vReturn = new List<byte>();
                List<byte> vTemp = new List<byte>();
                foreach (byte B in vSBytes) 
                    vTemp.Add(B);
                foreach (byte vKByte in vKBytes)
                {
                    if (vReturn.Count != 0)
                    {
                        vTemp.Clear();
                        foreach (byte B in vReturn)
                            vTemp.Add(B);
                    }
                    foreach (char vChar in vTemp)
                        vReturn.Add((byte)(vKByte ^ vChar));
                }
                return StrToHex(vReturn);
            } 
     
      

  11.   

    是我搞错了,不好意思
    我的是.net2003,编译你的代码有2行通不过,错误提示是这样的:
    -------------------------------------------
    List<byte> vReturn = new List<byte>();< 无效的表达式项“byte”
    vReturn 应输入 ;
    < 新的表达式要求在类型后有 () 或 [] 
    > 无效的表达式项“byte”
    -------------------------------------------
    下边一行的错误提示跟这个相同
    能帮我看改成.net2003的吗,不行的话我明天安装个.net2005试试
    谢谢……                             
    List<byte> vTemp = new List<byte>();
      

  12.   

    mzy1982:
    不是我懒,实话说,我是做ASP的,delphi是懂一点点,C#刚刚接触,上边的代码我昨天搞了一个晚上也搞不好,所以才发帖求助的。Convert强制转换不了……
      

  13.   

    我手里没有2003的环境,你装一个2003看看吧ke5315309贴的代码是根本不能实现的
    Delphi里的string是 Ansi编码C#里string是Utf8编码我的代码都是自己先调试过,得到正确结果才贴
      

  14.   

    好的,明天晚上结帖
    再次感谢zswang的帮助
      

  15.   

    zswang,您好!
    您帮我翻译delphi代码的帖子我已经结了,但是我今天测试后发现您的加密代码 运行结果不相同。
    StrtoHex函数跟我的结果相同,是您帮我简化的这段delphi代码错了,当然C#版也就错了:)
    请您帮我改下吧,我没别的办法了,谢谢……//下边是你帮我简化的代码,运行结果跟我的不同
    function myenctstr(S: string; sKey: string): string;
    var
      I, J: Integer;
    begin
      Result := '';
      for I := 1 to Length(sKey) do
      begin
        if I <> 1 then S := Result;
        for J := 1 to Length(S) do
          Result := Result + Char(Ord(sKey[I]) xor Ord(S[J]));
      end;
      Result := StrToHex(Result);
    endprocedure TForm1.Button1Click(Sender: TObject);
    begin
      Memo1.Text := myenctstr('说实话这代码写得很难看', 'Zswang');
    end;
    -------
    运行结果:585B580E58080D0A5E0F58585C5B0F5E5C0E535C5B52080E525E0D0F52520F0F3132316731616463376631313532663735673A35323B61673B3764663B3B66663437346234646166326334343037633230623F30373E64623E3261633E3E63635D5E5D0B5D0D080F5B0A5D5D595E0A5B590B56595E570D0B575B080A57570A0A
    //下边是我原来的代码
    function myenctstr_old(const s:string; skey:string):string;
    var
        i,j: integer;
        hexS,hexskey,midS,tmpstr:string;
        a,b,c:byte;
    begin
        hexS   :=myStrtoHex(s);
        hexskey:=myStrtoHex(skey);
        midS   :=hexS;
        for i:=1 to (length(hexskey) div 2)   do
        begin
            if i<>1 then midS:= tmpstr;
            tmpstr:='';
            for j:=1 to (length(midS) div 2) do
            begin
                a:=strtoint('$'+midS[2*j-1]+midS[2*j]);
                b:=strtoint('$'+hexskey[2*i-1]+hexskey[2*i]);
                c:=a xor b;
                tmpstr := tmpstr+myStrtoHex(chr(c));
            end;
        end;
        result := tmpstr;
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      Memo1.Text := myenctstr_old('说实话这代码写得很难看', 'Zswang');
    end;
    -------------
    运行结果:FD83FC838D86E3D482CCF4DDE68283F58CEAF2E78982
      

  16.   

    你给的函数前面有一句关键代码的不同
    ...        
    function myenctstr(const s:string; skey:string):string;
    //...
    begin
    //...
        for i:=1 to (length(hexskey) div 2)   do
        begin
            if i<>1 then midS:= tmpstr;
            for j:=1 to (length(midS) div 2) do
    //...
        end;
        result := tmpstr;
    end;function myenctstr_old(const s:string; skey:string):string;
    //...
    begin
    //...
        for i:=1 to (length(hexskey) div 2)   do
        begin
            if i<>1 then midS:= tmpstr;
            tmpstr:='';
            for j:=1 to (length(midS) div 2) do
    //...
        end;
        result := tmpstr;
    end;
      

  17.   

    function myenctstr_zs(S: string; sKey: string): string;
    var
      I, J: Integer;
    begin
      Result := '';
      for I := 1 to Length(sKey) do
      begin
        if I <> 1 then S := Result;
        Result := '';
        for J := 1 to Length(S) do
          Result := Result + Char(Ord(sKey[I]) xor Ord(S[J]));
      end;
      Result := StrToHex(Result);
    end;FD83FC838D86E3D482CCF4DDE68283F58CEAF2E78982
            public string StrToHex(List<byte> mStr) //返回处理后的十六进制字符串
            {
                string vReturn = "";
                foreach (char Value in mStr)
                    vReturn += ((byte)Value).ToString("X2");
                return vReturn;
            }
            public string myenctstr(string S, string sKey)
            {
                
                byte[] vSBytes = ASCIIEncoding.Default.GetBytes(S);
                byte[] vKBytes = ASCIIEncoding.Default.GetBytes(sKey);            List<byte> vReturn = new List<byte>();
                List<byte> vTemp = new List<byte>();
                foreach (byte B in vSBytes)
                    vTemp.Add(B);
                foreach (byte vKByte in vKBytes)
                {
                    if (vReturn.Count != 0)
                    {
                        vTemp.Clear();
                        foreach (byte B in vReturn)
                            vTemp.Add(B);
                    }
                    vReturn.Clear();
                    foreach (char vChar in vTemp)
                        vReturn.Add((byte)(vKByte ^ vChar));
                }
                return StrToHex(vReturn);
            }