Pour être complet, vous pouvez aussi facilement le faire sans appeler aucune fonction de bibliothèque lourde (pas de snprintf, pas de strcat, pas même de memcpy). Cela peut être utile, par exemple si vous programmez un microcontrôleur ou un noyau d'OS où la libc n'est pas disponible.
Rien de vraiment fantaisiste, vous pouvez trouver un code similaire si vous le recherchez sur Google. En réalité, ce n'est pas beaucoup plus compliqué que d'appeler snprintf et c'est beaucoup plus rapide.
#include <stdio.h>
int main(){
unsigned char buf[] = {0, 1, 10, 11};
/* target buffer should be large enough */
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. Elle évite simplement la variable d'index intermédiaire i et la duplication du code de la dernière casse (mais le caractère de fin est écrit deux fois).
#include <stdio.h>
int main(){
unsigned char buf[] = {0, 1, 10, 11};
/* target buffer should be large enough */
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 une autre version pour répondre à un commentaire disant que j'ai utilisé un "truc" pour connaître la taille du tampon d'entrée. En fait, ce n'est pas une astuce mais une connaissance nécessaire de l'entrée (vous devez connaître la taille des données que vous convertissez). J'ai rendu cela plus clair en extrayant le code de conversion dans une fonction séparée. J'ai également ajouté un code de vérification des limites pour le tampon cible, 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){
/* Better to truncate output string than overflow buffer */
/* it would be still better to either return a status */
/* or ensure the target buffer is large enough and it never happen */
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);
}
0 votes
buf[i]
doivent être lancés versunsigned char
ou il débordera sibuf[i] > 127
c'est-à-dire :buf_ptr += sprintf(buf_ptr, "%02X", (unsigned char)buf[i]);