Я пытаюсь преобразовать хэш-функцию JavaScript в хеширование С#, чтобы сделать то же самое. Я на 99% там, но я столкнулся с проблемой десятичных знаков, используемых в этой пользовательской функции.
Не знаю, почему, но эта функция преобразует хэшированное значение в десятичное по какой-то странной причине, и моя проблема в том, что сгенерированные десятичные числа не всегда такой же длины. Десятичные дроби в C# немного длиннее, но имеют одинаковую длину. Проблема, с которой я сталкиваюсь, заключается в том, что округление в С# работает иначе, чем в JavaScript. Я точно не знаю, с каким десятичным числом округлить, чтобы создать строку эквивалентной длины.
Вот пример двух сгенерированных десятичных строк, которые добавляются друг к другу. Оба начинаются со строк из 4,4 и 3 символов:
4 char string generates 79957.88183577501 4 char string generates 160933.02806113224 3 char string generates 609.9111294990053
Используя точно такой же код, который генерирует C#, используя те же входные данные:
79957.88183577500452161331162 160933.02806113221197323204919 609.91112949900524507144149035
Если бы все строки были одинаковой длины, это не было бы проблемой, но я понятия не имею, как определить, когда JS сгенерирует более длинное десятичное число. Любые подсказки? Комментарии? Мнения?
К сожалению, принимающий код по-прежнему является исходным JS, который просто меняет процесс, поэтому мне приходится идеально дублировать конечный результат для всех входных данных.
РЕДАКТИРОВАТЬ:
Вот проблемный раздел. Не спрашивайте меня, почему это так работает, я это не писал.
// oString is a full string to be encoded
// oKey is a key to be used for encoding
function completeHash(oString,oKey) {
if( oKey.length < 5 ) {
window.alert( 'The key must be at least 5 characters long' );
return oString;
}
var oKeyNum = new Array(), oOutStr = '', oOp = new Array('+=','/=','-=','*= 0.01 *');
for (var x = 0; x < oKey.length; x++) {
oKeyNum[x] = parseInt('0x' + completeEscape(oKey.charAt(x)));
}
for( var x = 0, y = ''; x < oString.length; x += Math.round( oKey.length / 2 ), y = 'O.O' ) {
var theNum = parseInt( '0x' + completeEscape( oString.substr( x, Math.round( oKey.length / 2 ) ) ) );
// next two lines are problematic with decimals not having equal length
for( var z = 0; z < oKey.length; z++ ) {
eval( 'theNum ' + oOp[z % 4] + ' ' + oKeyNum[z] + ';' );
alert('theNum:' + theNum);
}
oOutStr += y + theNum;
}
return oOutStr;
}
Функция completeEscape()
просто возвращает коды ASCII int для каждого символа.
У меня все работает хорошо, кроме длины десятичных знаков.
Decimal
, вы имеете в виду значение с плавающей запятой? Насколько мне известно, в javascript нет типа данныхDecimal
. - person Magnus   schedule 24.10.2012