Как заменить 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, что означает успешное выполнение программы.