Как заменить sprintf - C (СИ)
Формулировка задачи:
В функции есть такой фрагмент:
Собственно это часть реализации алгоритма md5. Данная часть преобразует строку вида 3245904243413290249245242340528048204, полученную при реализации алгоритма (сдвиги и тп.) в строку вида 1b14f3fbaf40a42515fc9f0aaf10eab0, тоесть окончательно обрабатывает чтобы полуить 16-тиричное значение.
Проблема заключается в самой
for (di = 0; di < 16; ++di) sprintf(hex_output + di * 2, "%02x", digest[di]);
sptintf
, поскольку для ее работы нужно подключить библиотеку stdio.h, а при компиляции с включением в исходный файл библиотек приложение получается на 300Кбайт больше, а для меня это не допустимо) Нужно не больше 30-40 Кбайт.Решение задачи: «Как заменить sprintf»
textual
Листинг программы
int main(void) { int i, j; unsigned char val[16] = { 0x01, 0xa2, 0xcf, 0xff, 0xaa, 0x00, 0x10, 0x98, 0x07, 0xbb, 0xcc, 0xfa, 0xcd, 0xee, 0x00, 0x55 }; char out[33]; for (i = 0, j = 0; i < 16; i++) { int l = ((val[i] >> 4) & 0x0f); int r = (val[i] & 0x0f); if (l > 9) l = 'a' + (l % 10); else l += '0'; if (r > 9) r = 'a' + (r % 10); else r += '0'; out[j++] = l; out[j++] = r; } out[j] = 0; printf("out = %s\n", out); return 0; }
Объяснение кода листинга программы
- Объявлены две переменные типа int - i и j, и две переменные типа char - val и out.
- Массив val инициализирован 16 байтами, каждый из которых представляет собой 16-битное беззнаковое число.
- Массив out инициализирован 32 символами.
- В цикле for перебираются все элементы массива val.
- Внутри цикла выполняются следующие действия: a. Переменные l и r получают соответственно старший и младший байты числа, представленного в val[i]. b. Если l больше 9, то к нему добавляется 'a' и (l % 10) - это значение l в виде цифры от 0 до 9. c. Если r больше 9, то к нему добавляется 'a' и (r % 10) - это значение r в виде цифры от 0 до 9. d. Значения l и r записываются в массив out, при этом индексы для записи определяются переменной j. e. j увеличивается на 2, так как в массиве out каждому символу соответствует два байта.
- После окончания цикла, нулевой символ записывается в последний элемент массива out.
- Выводится строка
out =
и затем весь массив out. - Функция main() возвращает 0, что означает успешное выполнение программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д