为了我自己的目的,我尝试将令人敬畏的脚本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。:奇怪的行为,我不能说你好,它总是被删除......
答案 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实施,应该有很多可用的。这有助于您避免错误和性能问题。