เพื่อความสมบูรณ์คุณสามารถทำได้อย่างง่ายดายโดยไม่ต้องเรียกใช้ฟังก์ชันไลบรารีที่หนักหน่วง (ไม่มี snprintf ไม่มี strcat หรือแม้แต่ memcpy) อาจเป็นประโยชน์เช่นหากคุณกำลังเขียนโปรแกรมไมโครคอนโทรลเลอร์หรือเคอร์เนลระบบปฏิบัติการที่ libc ไม่พร้อมใช้งาน
ไม่มีอะไรน่าสนใจจริงๆที่คุณจะพบรหัสที่คล้ายกันหากคุณใช้ Google จริงๆแล้วมันไม่ซับซ้อนไปกว่าการเรียก snprintf และเร็วกว่ามาก
#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);
}
นี่คืออีกเวอร์ชันที่สั้นกว่าเล็กน้อย เป็นเพียงการหลีกเลี่ยงตัวแปรดัชนีกลาง i และการทำซ้ำรหัส laste case (แต่อักขระการยุติถูกเขียนสองครั้ง)
#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);
}
ด้านล่างนี้เป็นอีกเวอร์ชันสำหรับตอบความคิดเห็นที่บอกว่าฉันใช้ "เคล็ดลับ" เพื่อให้ทราบขนาดของบัฟเฟอร์อินพุต จริงๆแล้วมันไม่ใช่เคล็ดลับ แต่เป็นความรู้ในการป้อนข้อมูลที่จำเป็น (คุณต้องรู้ขนาดของข้อมูลที่คุณกำลังแปลง) ฉันทำให้สิ่งนี้ชัดเจนขึ้นโดยการแยกรหัสการแปลงเป็นฟังก์ชันแยกต่างหาก ฉันยังเพิ่มรหัสตรวจสอบขอบเขตสำหรับบัฟเฟอร์เป้าหมายซึ่งไม่จำเป็นจริงๆหากเรารู้ว่าเรากำลังทำอะไรอยู่
#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]
จะต้องถูกโยนไปunsigned char
หรือมันจะล้นถ้าbuf[i] > 127
นั่นคือ:buf_ptr += sprintf(buf_ptr, "%02X", (unsigned char)buf[i]);