Zum Abschluss können Sie dies auch problemlos tun, ohne eine umfangreiche Bibliotheksfunktion aufzurufen (kein snprintf, kein strcat, nicht einmal memcpy). Dies kann beispielsweise nützlich sein, wenn Sie einen Mikrocontroller oder einen Betriebssystemkern programmieren, für den libc nicht verfügbar ist.
Nichts Besonderes, Sie können ähnlichen Code finden, wenn Sie danach googeln. Wirklich, es ist nicht viel komplizierter als snprintf aufzurufen und viel schneller.
#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);
}
Hier ist eine weitere etwas kürzere Version. Es wird lediglich die Zwischenindexvariable i und das Duplizieren des letzten Fallcodes vermieden (das abschließende Zeichen wird jedoch zweimal geschrieben).
#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);
}
Unten finden Sie eine weitere Version, um auf einen Kommentar zu antworten, der besagt, dass ich einen "Trick" verwendet habe, um die Größe des Eingabepuffers zu ermitteln. Eigentlich ist es kein Trick, sondern ein notwendiges Eingabewissen (Sie müssen die Größe der Daten kennen, die Sie konvertieren). Ich habe dies klarer gemacht, indem ich den Konvertierungscode in eine separate Funktion extrahiert habe. Ich habe auch einen Grenzprüfcode für den Zielpuffer hinzugefügt, der nicht wirklich notwendig ist, wenn wir wissen, was wir tun.
#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);
}
buf[i]
muss gegossen werdenunsigned char
, oder es wird überlaufen, wennbuf[i] > 127
das heißt:buf_ptr += sprintf(buf_ptr, "%02X", (unsigned char)buf[i]);