Написах библиотека за преобразуване на числа в текст в трите основни формата: десетичен, шестнайсетичен и двоичен. Ползвам я от няколко години в друга библиотека за отпечатване на дебъг информация. Библиотеката е предназначена за микроконтролери ATtiny85 или подобни, като целта е да работи с минимално количество памет за код и за данни.
Размер (приблизителен) на библиотеката:
Program: 1074 bytes (13.1% Full)
(.text + .data + .bootloader)
Data: 12 bytes (2.3% Full)
(.data + .bss + .noinit)
Кода на библиотеката се намира на адрес: https://gitlab.com/tinusaur/tinyavrlib/
Файловете са:
- tinyavrlib/num2str.h
- tinyavrlib/num2str.c
Функциите са:
- uint8_t usint2decascii(uint16_t, char *);
- uint8_t usint2hexascii(uint16_t, char *);
- uint8_t usint2binascii(uint16_t, char *);
Как се използва
На функцията трябва да се подадат два аргумента: (1) числото, което да се преобразува; (2) указател към буфер, в който да се запише резултата.
Аз ползвам тези функции в друга библиотека: OWOWOD – One-Wire/One-Way Output for Debugging, която е отпечатване на дебъг информация. По-долу съм дал няколко примера.
Преобразуване на цяло число в десетично със знак:
char buffer[USINT2DECASCII_MAX_DIGITS + 2]; // One more byte for the sign.
buffer[0] = ' '; // Init the string.
buffer[USINT2DECASCII_MAX_DIGITS + 1] = '\0'; // Terminate the string.
uint8_t digits = usint2decascii((num < 0 ? -num : num), buffer + 1);
if (num < 0) buffer[digits] = '-';
owowod_print_string(buffer + digits + (num < 0 ? 0 : 1));
Примерен резултат:
A=123 B=-19858 C=-901
Преобразуване в шестнайсетично число, без знак, със запълване с нули:
char buffer[USINT2HEXASCII_MAX_DIGITS + 1];
buffer[USINT2HEXASCII_MAX_DIGITS] = '\0'; // Terminate the string.
usint2hexascii(num, buffer);
owowod_print_string(buffer + USINT2HEXASCII_MAX_DIGITS / 2);
Примерен резултат:
D=04D2 E=1DD5 F=CFC7
Преобразуване в двоично число, без знак, със запълване с нули:
char buffer[USINT2BINASCII_MAX_DIGITS + 1];
buffer[USINT2BINASCII_MAX_DIGITS] = '\0'; // Terminate the string.
usint2binascii(num, buffer);
owowod_print_string(buffer);
Примерен резултат:
K=0000000000000001 L=0000000011101010 M=1101110111010101
Друга информация
Информация за OWOWOD библиотеката: https://gitlab.com/tinusaur/owowod