Untuk menyelesaikannya, Anda juga dapat melakukannya dengan mudah tanpa memanggil fungsi library yang berat (tanpa snprintf, tanpa strcat, bahkan memcpy). Ini bisa berguna, katakanlah jika Anda memprogram beberapa mikrokontroler atau kernel OS di mana libc tidak tersedia.
Tidak ada yang benar-benar mewah Anda dapat menemukan kode serupa di sekitar jika Anda google untuk itu. Sungguh tidak jauh lebih rumit daripada memanggil snprintf dan jauh lebih cepat.
#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);
}
Ini adalah versi lain yang sedikit lebih pendek. Ini hanya menghindari variabel indeks menengah i dan menduplikasi kode kasus laste (tetapi karakter pengakhiran ditulis dua kali).
#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);
}
Di bawah ini adalah versi lain untuk menjawab komentar yang mengatakan saya menggunakan "trik" untuk mengetahui ukuran buffer input. Sebenarnya ini bukan tipuan tetapi pengetahuan masukan yang diperlukan (Anda perlu mengetahui ukuran data yang Anda konversi). Saya membuat ini lebih jelas dengan mengekstrak kode konversi ke fungsi terpisah. Saya juga menambahkan kode pemeriksaan batas untuk buffer target, yang sebenarnya tidak diperlukan jika kita tahu apa yang kita lakukan.
#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]
harus dicorunsigned char
, atau akan meluap jikabuf[i] > 127
, yaitu:buf_ptr += sprintf(buf_ptr, "%02X", (unsigned char)buf[i]);