Pour être complet, vous pouvez également le faire facilement sans appeler de fonction de bibliothèque lourde (pas de snprintf, pas de strcat, même pas memcpy). Cela peut être utile, par exemple si vous programmez un microcontrôleur ou un noyau de système d'exploitation où la libc n'est pas disponible.
Rien de vraiment fantastique, vous pouvez trouver un code similaire si vous recherchez sur Google. Ce n'est vraiment pas beaucoup plus compliqué que d'appeler snprintf et beaucoup plus rapide.
#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);
}
Voici une autre version légèrement plus courte. Il évite simplement la variable d'index intermédiaire i et la duplication du dernier code de cas (mais le caractère de fin est écrit deux fois).
#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);
}
Voici encore une autre version pour répondre à un commentaire disant que j'ai utilisé une "astuce" pour connaître la taille du tampon d'entrée. En fait, ce n'est pas une astuce mais une connaissance d'entrée nécessaire (vous devez connaître la taille des données que vous convertissez). J'ai clarifié cela en extrayant le code de conversion dans une fonction distincte. J'ai également ajouté un code de vérification des limites pour le tampon cible, ce qui n'est pas vraiment nécessaire si nous savons ce que nous faisons.
#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]
doit être jetéunsigned char
, ou il débordera sibuf[i] > 127
, c'est-à-dire:buf_ptr += sprintf(buf_ptr, "%02X", (unsigned char)buf[i]);