Как пояснили другие, var z = code[i] - 0x30
- это стандартный код, чтобы получить значение знака цифры. Как отметил Глорин Оакенфут, этот код не выполняет никаких ограничений. Поэтому он отлично работает для «0» - 0x30 (фактически, это «0» - «0», кстати), а для «9» - 0x30. Но это также произведет странность как «A» - 0x30 = 32.
Комментарий Глорина также прав - остальные номера кажутся очень специфичными для контекста. Вероятно, это хеш-функция - она вычисляет в основном уникальное число для данной строки. Я проведу вас через петлю, но то, что она делает, не имеет никакого реального смысла. Вместо ввода «11111» давайте посмотрим на «12345»:
1-й тайм-цикл: i = 4, код [i] = '5', z = 5, sum = 0 + 15 * 20 = 300
второй раз через петлю: я = 3, код [I] = '4', г = 4, сумма = 300 + 14 * 20 = 580
3-й раз через петлю: я = 2, код [я ] = '3', z = 3, sum = 580 + 13 * 20 = 840
4-я временная петля: i = 1, код [i] = '2', z = 2, sum = 840 + 12 * 20 = 1080
Пятый раз через цикл: i = 0, код [i] = '1', z = 1, sum = 1080 + 11 * 20 = 1300
Как я уже говорил, это, скорее всего, используется для хеширования. Каждая строка цифр, которые вы вводите, скорее всего, будет иметь уникальный целочисленный код. Хеширование струн может повысить эффективность. Если ничего другого, это дает вам довольно надежный тест для сравнения. См. https://en.wikipedia.org/wiki/Hash_function
Конечно, большинство строковых хэш-функций не выполняют преобразование из цифры в int. И если функция требует, чтобы входные данные были только цифрами, что, как представляется, подразумевается преобразованием в int, простейший хеш для этой строки состоит в том, чтобы просто проанализировать ее на целое число.
Другое, что мне напоминает, это попытка разобрать целую строку на цифру. Это было бы очень похожи, но обратите внимание на различия ниже:
var sum = 0
for (var i = 0; i < code.Length; i++)
{
var z = code[i] - '0' // this is the same as - 0x30, but more clear to read
sum = sum * 10 + z
}
УЧИТЫВАЯ имя функции, хотя, кажется, гораздо более вероятно, что она предназначена в качестве хэш-функции.
0x30 это символ «0». Таким образом, вычитание 0x30 из текущего символа ('code [i]') должно давать численное значение этого символа. Имеет очевидный недостаток без ограничений, чтобы убедиться, что символ * на самом деле * числовой. Математика с b1 и b2 представляется специфичной для контекста. Трудно догадаться. –
Это довольно ужасный код, особенно если он используется в производственной среде. Это чересчур многословно, имеет магические числа повсюду и пытается быть умным, проскальзывая в 0x30 вместо того, чтобы просто использовать «0». –
C# 'string' и' char' не используют ASCII. 0x30 - UTF-16 для '0'. В коде «0» намного легче читать. UTF-16 является одним из нескольких кодировок для набора символов Unicode. (UTF-8 очень часто используется для файлов и потоков, таких как эта веб-страница.) [BTW-Java, JavaScript, HTML, XML, ... все тоже используют Unicode.] –