Tamlık için, herhangi bir ağır kütüphane işlevini çağırmadan da kolayca yapabilirsiniz (snprintf, strcat, hatta memcpy yok). Örneğin, libc'nin bulunmadığı bir yerde mikro denetleyici veya işletim sistemi çekirdeği programlıyorsanız yararlı olabilir.
Eğer bunun için Google'da ararsanız, etrafta benzer bir kod bulamazsınız. Gerçekten, snprintf'i aramaktan çok daha karmaşık ve çok daha hızlı değil.
#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);
}
İşte biraz daha kısa bir versiyon. Sadece ara indeks değişkeni i'den ve son durum kodunu çoğaltmaktan kaçınır (ancak sonlandırma karakteri iki kez yazılır).
#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);
}
Aşağıda, giriş arabelleğinin boyutunu bilmek için bir "numara" kullandığımı söyleyen bir yoruma yanıt verecek başka bir sürüm daha var. Aslında bu bir numara değil, gerekli bir girdi bilgisi (dönüştürdüğünüz verinin boyutunu bilmeniz gerekir). Bunu, dönüştürme kodunu ayrı bir işleve çıkararak daha net hale getirdim. Ayrıca, ne yaptığımızı biliyorsak gerçekten gerekli olmayan hedef tampon için sınır kontrol kodu ekledim.
#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]
atılmalıdırunsigned char
, yoksa taşacakbuf[i] > 127
, yani:buf_ptr += sprintf(buf_ptr, "%02X", (unsigned char)buf[i]);