none
一个关于字符串的操作 RRS feed

  • 问题

  • 	CString Result,str;
    
    	int i,j;
    
    
    
    	Result.Empty(); // 清除结果
    
    	for(i=0; i < S.GetLength()/2; i++) // 将字符串两个字母一组进行处理
    
    	{
    
    		j = ((BYTE)S.GetAt(2*i)-65)*26;//相应的,解密处要改为相同的数
    
    
    
    		j += (BYTE)S.GetAt(2*i+1)-65;
    
    		str="1"; // 设置str长度为1
    
    		str.SetAt(0, j);
    
    		Result+=str; // 追加字符,还原字符串
    
    	}
    
    	S=Result; // 保存中间结果
    
    	for(i=0; i<S.GetLength(); i++) // 依次对字符串中各字符进行操作
    
    	{
    
    		Result.SetAt(i, (BYTE)S.GetAt(i)^(Key>>8)); // 将密钥移位后与字符异或
    
    		Key = ((BYTE)S.GetAt(i)+Key)*C1+C2; // 产生下一个密钥
    
    	}
    
    	return Result;
    
    

    上面是一段C++的代码,现在我想转换为c#的,但是发现c#中没有GetAt和SetAt,其中C1,C2,KEY是预先设定好的值

     for (i = 0; i < S.Length / 2; i++)
    
       {
    
    
    
        char s = S[2*i];
    
        
    
        int temp2 = Convert.ToInt32(s); 
    
        j = ( temp2- 65) * 26;
    
        char m = S[2 * i + 1];
    
        j += Convert.ToInt32(m) - 65;
    
        str = "1";
    
        char[] d;
    
        d = str.ToCharArray();
    
        d[0] = (char)j;
    
        string ww = new string(d);
    
        Result += ww;
    
       }
    
       S = Result;
    
     string ret;
    
       for (i = 0; i < S.Length; i++)
    
       {
    
    
    
        
    
        char t = S[i];
    
        int temp2 = Convert.ToInt32(t);
    
        long temp3 = KEY_CRYPT;
    
        temp3 =temp2 ^(temp3 >> 8);
    
        // temp3 = temp2 ^ (temp3 >>= 8);
    
    
    
        char[] d;
    
        d = Result.ToCharArray();
    
        d[i] = (char)temp3;
    
        KEY = (d[i] + KEY) * C1 + C2;
    
        ret = new string(d);
    
       }
    
    		retuen ret;  
    
    
    上面是我写的代码,但是结果不正确,不清楚问题出在哪,望高人指正
    • 已编辑 yooho 2011年3月11日 7:49
    2011年3月11日 7:37

答案

  • c# 默认是Unicode,双字节表示一个字符,不知道是否注意到这点没有。

     

    另外,结果如何不正确,最好说出来。人不是编译器,不能通过你给的代码,就能立即找出如何不正确的。最好给出正确和错误的输入输出。以利于重点排错。

    • 已标记为答案 yooho 2011年3月11日 8:20
    2011年3月11日 7:41

全部回复

  • c# 默认是Unicode,双字节表示一个字符,不知道是否注意到这点没有。

     

    另外,结果如何不正确,最好说出来。人不是编译器,不能通过你给的代码,就能立即找出如何不正确的。最好给出正确和错误的输入输出。以利于重点排错。

    • 已标记为答案 yooho 2011年3月11日 8:20
    2011年3月11日 7:41
  • 嗯,你提示的很正确,正常情况下S = IFEIEXACJCHS 返回值ret = 123321

    但是C#的执行以后返回的是乱码 ret = 贱pìÈ

    在第一个for循环中每次循环的j 的值与c++调试的时候是一样的,但是后面for循环就不一样了.

    2011年3月11日 7:52
  • 我知道什么原因了,KEY的值是long型的,进行>>操作以后就溢出了。现在弄好了.
    2011年3月11日 8:19