Aby uzyskać kompletność, możesz to również łatwo zrobić bez wywoływania żadnej ciężkiej funkcji bibliotecznej (bez snprintf, bez strcat, nawet memcpy). Może być przydatne, powiedzmy, jeśli programujesz jakiś mikrokontroler lub jądro systemu operacyjnego, w którym biblioteka libc nie jest dostępna.
Nie ma nic bardziej wyszukanego, co można znaleźć w pobliżu podobnego kodu, jeśli wyszukasz go w Google. Naprawdę nie jest to dużo bardziej skomplikowane niż wywołanie snprintf i znacznie szybsze.
#include <stdio.h>
int main(){
unsigned char buf[] = {0, 1, 10, 11};
char str[12];
unsigned char * pin = buf;
const char * hex = "0123456789ABCDEF";
char * pout = str;
int i = 0;
for(; i < sizeof(buf)-1; ++i){
*pout++ = hex[(*pin>>4)&0xF];
*pout++ = hex[(*pin++)&0xF];
*pout++ = ':';
}
*pout++ = hex[(*pin>>4)&0xF];
*pout++ = hex[(*pin)&0xF];
*pout = 0;
printf("%s\n", str);
}
Oto kolejna, nieco krótsza wersja. Po prostu unika pośredniej zmiennej indeksu i oraz powielania kodu ostatniej sprawy (ale znak kończący jest zapisywany dwa razy).
#include <stdio.h>
int main(){
unsigned char buf[] = {0, 1, 10, 11};
char str[12];
unsigned char * pin = buf;
const char * hex = "0123456789ABCDEF";
char * pout = str;
for(; pin < buf+sizeof(buf); pout+=3, pin++){
pout[0] = hex[(*pin>>4) & 0xF];
pout[1] = hex[ *pin & 0xF];
pout[2] = ':';
}
pout[-1] = 0;
printf("%s\n", str);
}
Poniżej znajduje się kolejna wersja, aby odpowiedzieć na komentarz mówiący, że użyłem "sztuczki", aby poznać rozmiar bufora wejściowego. Właściwie to nie jest sztuczka, ale niezbędna wiedza wejściowa (musisz znać rozmiar danych, które konwertujesz). Wyjaśniłem to, wyodrębniając kod konwersji do oddzielnej funkcji. Dodałem również kod kontroli granic dla bufora docelowego, co nie jest konieczne, jeśli wiemy, co robimy.
#include <stdio.h>
void tohex(unsigned char * in, size_t insz, char * out, size_t outsz)
{
unsigned char * pin = in;
const char * hex = "0123456789ABCDEF";
char * pout = out;
for(; pin < in+insz; pout +=3, pin++){
pout[0] = hex[(*pin>>4) & 0xF];
pout[1] = hex[ *pin & 0xF];
pout[2] = ':';
if (pout + 3 - out > outsz){
break;
}
}
pout[-1] = 0;
}
int main(){
enum {insz = 4, outsz = 3*insz};
unsigned char buf[] = {0, 1, 10, 11};
char str[outsz];
tohex(buf, insz, str, outsz);
printf("%s\n", str);
}
buf[i]
musi być rzuconyunsigned char
, bo przepełni się, jeślibuf[i] > 127
to jest:buf_ptr += sprintf(buf_ptr, "%02X", (unsigned char)buf[i]);