gpt4 book ai didi

c# - 加密包含 unicode 的字符串会导致无法识别的字符

转载 作者:行者123 更新时间:2023-11-30 19:57:18 24 4
gpt4 key购买 nike

我正在尝试用 C# 加密一个字符串:

static public string Encrypt(char[] a)
{
for (int i = 0; i < a.Length; i++)
{
a[i] -= (char)(i + 1);
if (a[i] < '!')
{
a[i] += (char)(i + 20);
}
}
return new string(a);
}

现在,当我输入这个字符串时:

"Qui habite dans un ananas sous la mer?".

加密结果为:

`Psf3c[[ak[3XT`d3d\3MYKWIZ3XSXU3L@?JAMR`

在 @ 之后有一个无法识别的字符。我不知道它是怎么到那里的,我也不知道为什么。

如果我尝试解密它(使用这种方法:)

static public string Decrypt(char[] a)
{
for (int i = 0; i < a.Length; i++)
{
a[i] += (char)(i + 1);
if ((a[i] - 20) - i <= '!')
{
a[i] -= (char)(i + 20);
}
}
return new string(a);
}

这是(不正确的)输出:

Qui habite dans un ananas sous laamerx.

如何允许加密例程访问 unicode 字符?

最佳答案

你得到不可打印字符的原因是这一行:

a[i] -= (char)(i + 1);

正在发生的是你在里面的空间 la mer是字符串的第34位,相当于一个空格的整数值是0x20 = 32。这意味着当你减去(i+1)时你得到-2。但是您将结果存储在 char 中,这是一个无符号类型,所以这实际上变成了 0xFFFE = 65534。然后当你测试 a[i] < '!' 时你得到假的,因为a[i]现在是一个很大的正数。

相反,您应该做的(如果您真的想实现此算法)是将结果存储在带符号的类型中,并在操作时对其进行操作,然后在最后将其转换为 char。

    int value = (int)a[i] - (i + 1);
if (value < (int)'!')
{
value += i + 20;
}
a[i] = (char)value;

(强调额外类型转换。)

这可能不是必需的,但我建议在 Decrypt 中使用相同的模式方法也一样。通常,推理适用于临时变量的代码比就地编辑要容易得多。

关于c# - 加密包含 unicode 的字符串会导致无法识别的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30744873/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com