Eine Umwandlung von einer Zahl in ein Hex-ASCII-Zeichen ist recht einfach.
Man kann es ausrechnen:
if (i>9) then c = i-10+'a'; else c = i+'0';
Oder kürzer mit dem Fragezeichen-Operator:
c = i>9 ? i-10+'a' : i+'0';
Oder man kann die Zahl als Index auf eine Tabelle verwenden:
unsigned char i, t[]="0123456789ABCDEF"; c = t[i];
Die Kurzschreibweise dafür ist dann das hier:
c = "0123456789ABCDEF"[i];
Wenn man diese Indizierung eines Strings und die Verwendung des Strings als Tabelle mal verstanden hat, tun sich einige weitere Einsatzmöglichkeiten auf. So zum Beispiel wenn ein Byte bis zu einem angegebenen Bit mit 1-en aufgefüllt werden soll. Das kann man ausrechnen:
c = (1<<i)-1;
Oder man kann es über eine Tabelle machen:
#include<stdio.h> int main() { unsigned char i, t[8]={1,3,7,15,31,63,127,255}; for (i=0; i<=7; i++) { printf("%c \t %d \t %d \t %d\n", "01234567"[i], t[i], (unsigned char)"\1\3\7\17\37\77\177\377"[i], // Oktal-Zahlen! (unsigned char)"\x1\x3\x7\xf\x1f\x3f\x7f\xff"[i]); // Hex-Zahlen! } return 0; }
ergibt das hier:
0 1 1 1 1 3 3 3 2 7 7 7 3 15 15 15 4 31 31 31 5 63 63 63 6 127 127 127 7 255 255 255
Mit einer kleinen Änderung der Tabelle kann dann ein gewünschtes Bits ausmaskiert werden:
unsigned char i, t[8]={1,2,4,8,16,32,64,128}; for (i=0; i<=7; i++) { printf("%c \t %d \t %d \t %d\n", "01234567"[i], t[i], (unsigned char)"\1\2\4\10\20\40\100\200"[i], // Oktal-Zahlen! (unsigned char)"\x1\x2\x4\x8\x10\x20\x40\x80"[i]); // Hex-Zahlen! }
ergibt das hier:
0 1 1 1 1 2 2 2 2 4 4 4 3 8 8 8 4 16 16 16 5 32 32 32 6 64 64 64 7 128 128 128
Und natürlich kann man in solche kleinen "Vor-Ort"-Tabellen noch einiges mehr packen. Z.B. ein Lauflichtmuster, eine Schritttabelle usw...