2016-01-25 2 views
0

Я пытаюсь преобразовать удивительный скрипт jquery.md5.js в C# для своей собственной цели. Но я не могу понять эти два метода:C# версия jquery.md5.js

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# ...

Спасибо заранее!

PS: Странное поведение, я не могу сказать, Привет, его всегда удаляется ...

+0

Пожалуйста, кто-нибудь? – UnBoug

ответ

1

Я не буду переводить весь код на C#, но объяснить несколько моментов:

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

Это в один конец, чтобы задать длину массива в javascript. В основном вы говорите, что элементы [0 ... (input.length >> 2) - 1]: undefined - что можно сравнить с null на C#. Как вы вычисления значения некоторых я бы избежать обнуляемых типов и просто инициализировать массив 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 реализация, должно быть много доступного. Это поможет избежать ошибок и проблем с производительностью.

+0

Большое спасибо! Это мне очень помогает! – UnBoug