Как заменить sprintf - C (СИ)

Узнай цену своей работы

Формулировка задачи:

В функции есть такой фрагмент:
 for (di = 0; di < 16; ++di)
    sprintf(hex_output + di * 2, "%02x", digest[di]);
Собственно это часть реализации алгоритма md5. Данная часть преобразует строку вида 3245904243413290249245242340528048204, полученную при реализации алгоритма (сдвиги и тп.) в строку вида 1b14f3fbaf40a42515fc9f0aaf10eab0, тоесть окончательно обрабатывает чтобы полуить 16-тиричное значение. Проблема заключается в самой

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;
}

Объяснение кода листинга программы

  1. Объявлены две переменные типа int - i и j, и две переменные типа char - val и out.
  2. Массив val инициализирован 16 байтами, каждый из которых представляет собой 16-битное беззнаковое число.
  3. Массив out инициализирован 32 символами.
  4. В цикле for перебираются все элементы массива val.
  5. Внутри цикла выполняются следующие действия: 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 каждому символу соответствует два байта.
  6. После окончания цикла, нулевой символ записывается в последний элемент массива out.
  7. Выводится строка out = и затем весь массив out.
  8. Функция main() возвращает 0, что означает успешное выполнение программы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 4.091 из 5
Похожие ответы