如何将JavaScript代码转换为C#代码

3
我有一个 JavaScript 方法。我用 C# 写了一份代码,但它不起作用。
JavaScript 代码:
var __AM = 65521;
    function cc(a) {
        var c = 1, b = 0, d, e;
        for (e = 0; e < a.length; e++) {
            d = a.charCodeAt(e);
            c = (c + d) % __AM;
            b = (b + c) % __AM;
        }
        return b << 16 | c;
    }

我的C#代码
        private string CC(string a)
    {
        var __AM = 65521;
        int e;
        long d;
        long c = 1, b = 0;
        for (e = 0; e < a.Length; e++)
        {
            var p = Encoding.Unicode.GetBytes(a[e].ToString());
            d = Convert.ToInt32(p.First());
            c = (c + d) % __AM;
            b = (b + c) % __AM;
        }
        return b.ToString() + c.ToString();
    }

JS测试
cc("4JipHEz53sU1406413803");

结果:1132332429
C# 测试
CC("4JipHEz53sU1406413803");

结果:172781421
如何在C#中获取JS值?

1
尝试在循环外使用 byte[] p = Encoding.ASCII.GetBytes(a);,然后只需使用 d = p[e] - Havenard
2
b.ToString() + c.ToString() 明显不等同于 b << 16 | c - vgru
这是Adler-32校验和算法。也许C#中有内置的实现?我不知道。 - Havenard
这是错误的。因为当它转换为字节时,只有数组的第一个值可用。 - user3356534
没有必要将其转换为字节。字符串基本上是一个char[]。只需将char强制转换为int,您就可以获得char代码。 - Cory
1个回答

2

这段代码是有效的:

private string cc(string a)
{
    var __AM = 65521;
    int e;
    long d;
    long c = 1, b = 0;
    for (e = 0; e < a.Length; e++)
    {
        d = (int)a[e];
        c = (c + d) % __AM;
        b = (b + c) % __AM;
    }
    return (b << 16 | c).ToString();
}

然而,JavaScript始终以UNICODE格式处理字符串,我不太了解C#,但也许字符串的处理方式不同。这段代码肯定适用于任何“a-z 0-9”字符串,但特殊字符呢?这是值得进一步测试的事情。 - Havenard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接