Еще несколько подсказок:
t - это двухбайтовый буфер, и вы всегда записываете только первый байт, оставляя завершающий ноль.Таким образом, t всегда является строкой ровно одного символа, и вы обрабатываете шестнадцатеричное число по одному символу за раз.Поэтому я думаю
tmp[0] = input[i].toAscii();
t = a + (int)(strtol(tmp, NULL, 16));
это примерно int t = a + Convert.ToInt32(input.substring(i, 1), 16);
- возьмите одну цифру из ввода и добавьте ее шестнадцатеричное значение к значению, которое вы посмотрели из таблицы.(Я предполагаю, что toAscii просто отображает символ QString, который уже является шестнадцатеричной цифрой, в ASCII для strtol, поэтому, если у вас уже есть строка шестнадцатеричных цифр, это нормально.)
Далее
v = (int)(strtol(input.mid(t, 2).toLocal8Bit(), NULL, 16));
это означает, что нужно найти два символа из ввода со смещением t, то есть input.substring(t, 2)
, а затем снова преобразовать их в шестнадцатеричное целое число.v = Convert.ToInt32(input.substring(t, 2), 16);
Теперь, как это бывает, я думаю, что вы все равно будете использовать здесь вторую цифру, так как вычисление (v * a) % 0x10
, но эй.Если снова мы работаем с QString из шестнадцатеричных цифр, то toLocal8Bit должно быть тем же преобразованием, что и toAscii - я не понимаю, почему ваш код имеет две разные функции здесь.
Наконец, преобразуйте эти значения в однуцифра в tmp, затем добавьте это к b
snprintf(tmp, 2, "%x", (v * m) % 0x10);
b += tmp;
(2 - длина буфера, и так как нам нужен завершающий nul, записывается только 1), т.е.
int digit = (v * m) % 0x10;
b += digit.ToString("x");
следует сделать.Я лично написал мод 16 как логическое и, & 0xf
, поскольку он предназначен для сокращения значения до одной цифры.
Обратите внимание, что в вашем коде i
никогда не устанавливается - яугадайте, что это цикл или что-то, что вы пропустили для краткости?
Итак, в итоге
int t = a + Convert.ToInt32(input.substring(i, 1), 16);
int v = Convert.ToInt32(input.substring(t, 2), 16);
int nextDigit = (v * m) & 0xf;
b += nextDigit.ToString("x");