int main()
{
char[] s = new char[40];
string p="箶知失";
for(int temp=0;temp<p.Length;temp++)
{
s[temp]=p[temp];
}
for(int temp=0;temp<s.Length;temp++)
{
if(s[temp]<0)
{
if(s[temp+1]==0) break;
}
s[temp]^=0x77;
}
Console.Write(s);
}
{
char[] s = new char[40];
string p="箶知失";
for(int temp=0;temp<p.Length;temp++)
{
s[temp]=p[temp];
}
for(int temp=0;temp<s.Length;temp++)
{
if(s[temp]<0)
{
if(s[temp+1]==0) break;
}
s[temp]^=0x77;
}
Console.Write(s);
}
for(int i = 0; i< s.Length;i++)
s[i] = (char)((int)s[i]^0x77);
Console.WriteLine(s);就这么简单。
程序语法没错,可是结果错了,正确的输出应该是“广州市”
各位大虾继续帮忙啊
朋友你的最后输出也不对
原C++代码的输出结果是"广州市" 没人能解答吗?
请详细指点一下,我必须使用上面的C++中的算法!
要源程序吗
是这样的,原来算法是用^0x77加密和解密的,算法不能改,
上面的C++可以把"箶知失"转换成"广州市",
我必须同样用C#能实现将"箶知失"转换成"广州市",
而不是将"嫘笣庈"转换成"广州市"。
简单说就是用C#重写上面的C++代码!
只因楼上前面几位朋友提供的C#代码均不能实现原来的功能。
所以向各位大虾继续求解!
string s = "箶知失";
byte[] bs = System.Text.Encoding.Unicode.GetBytes(s);
for (int i = 0; i < bs.Length; i++)
{
bs[i] ^= 0x77;
}
s = System.Text.Encoding.Unicode.GetString(bs);
Console.WriteLine(s);不过我估计你的编码是AscII的,那么你把上面的两个Unicode都改成GetEncoding("GB2312")就行了。此外我提醒你,并不是所有的字符经过 ^0x77 运算之后仍然是一个有效的字符。无效的字符你在VC里面是能够装到char数组里面去的,但是如果你在C#里面试图装载非法字符到char[]或者string里面,他会自动吧这个字符改成某一个固定代码的值,并且肯定不是原来的那个值了,这样会导致你解密失败。所以正确的做法是:直接将你加密过的密文装到byte[]里面,而不要读到char[]或者string里面。如果你还要做加密那部分的话,也不要将已经加密过的密文放到char[]或者string里面在输出到屏幕或者文件当中,这样很肯能会导致输出的不是你的密文内容,而是已经将非法字符替换成"?"的内容了。
//Encoding.GetEncoding("gb18030") 也可
//在简体中文平台上 Encoding.Default 也可,
Encoding enc = Encoding.GetEncoding(936);
byte[] bytes = enc.GetBytes(str);for (int i = 0; i < bytes.Length; i++)
{
if (bytes[i] > 127) //原义是:if ((sbyte)bytes[i] < 0)
{
i++;
if (i >= bytes.Length // 防止数组索引越界
|| bytes[i] == 0)
break;
}
bytes[i] ^= 0x77;
}
Console.WriteLine(enc.GetString(bytes));//