कंप्लीट के लिए, आप किसी भी भारी लाइब्रेरी फंक्शन (कोई स्निपर, नो स्ट्रैकट, यहां तक कि मेमोरैपी भी नहीं) को कॉल किए बिना भी आसानी से कर सकते हैं। यह उपयोगी हो सकता है, यह कहें कि यदि आप कुछ माइक्रोकंट्रोलर या OS कर्नेल की प्रोग्रामिंग कर रहे हैं, जहां libc उपलब्ध नहीं है।
कुछ भी नहीं वास्तव में फैंसी आप के आसपास समान कोड पा सकते हैं यदि आप इसके लिए Google। वास्तव में यह स्निपरफ और बहुत तेज कॉल करने की तुलना में अधिक जटिल नहीं है।
#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 और डुप्लीकेट लास्ट केस कोड (लेकिन टर्मिनेशन कैरेक्टर दो बार लिखा जाता है) से बचता है।
#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 charbuf[i] > 127buf_ptr += sprintf(buf_ptr, "%02X", (unsigned char)buf[i]);