C#版本的jquery.md5.js

时间:2016-01-25 20:52:47

标签: c# jquery

为了我自己的目的,我尝试将令人敬畏的脚本jquery.md5.js转换为C#。 但我无法弄清楚这两种方法:

function rstr2binl(input) {
    var i,
        output = [];
    output[(input.length >> 2) - 1] = undefined;
    for (i = 0; i < output.length; i += 1) {
        output[i] = 0;
    }
    for (i = 0; i < input.length * 8; i += 8) {
        output[i >> 5] |= (input.charCodeAt(i / 8) & 0xFF) << (i % 32);
    }
    return output;
}

我不太清楚他对“输出”做了什么......

function rstr_hmac_md5(key, data) {
    var i,
        bkey = rstr2binl(key),
        ipad = [],
        opad = [],
        hash;
    ipad[15] = opad[15] = undefined;                        
    if (bkey.length > 16) {
        bkey = binl_md5(bkey, key.length * 8);
    }
    for (i = 0; i < 16; i += 1) {
        ipad[i] = bkey[i] ^ 0x36363636;
        opad[i] = bkey[i] ^ 0x5C5C5C5C;
    }
    hash = binl_md5(ipad.concat(rstr2binl(data)), 512 + data.length * 8);
    return binl2rstr(binl_md5(opad.concat(hash), 512 + 128));
}

"ipad[15] = opad[15] = undefined;"

我不能在C#中做到这一点......

事先谢谢!

P.S。:奇怪的行为,我不能说你好,它总是被删除......

1 个答案:

答案 0 :(得分:1)

我不会将所有代码翻译成C#,但请解释几点:

var output = [];
output[(input.length >> 2) - 1] = undefined;

这是单向在javascript中设置数组长度。基本上你说元素[0 ... (input.length >> 2) - 1]undefined - 可以在C#中与null进行比较。在计算某些值时,我会避免使用可空类型,只需将数组初始化为0 - 因此C#等效值为:

int[] output = new int[(input.Length >> 2)];

接下来是使用右位移而不是正常除法。如果您比较运营商的the C#JavaScript描述,您会发现他们正在做同样的事情。因此,不需要转换,但您只需编写new int[input.Length / 4]

请注意,在脚本的current version中,数组初始化完成如下:

var output = Array(input.length >> 2);

最后要注意的是:除非你这样做是为了自我教育,采用现有的C#MD5实施,应该有很多可用的。这有助于您避免错误和性能问题。