কমপ্লিটডের জন্য, আপনি কোনও ভারী লাইব্রেরি ফাংশন (কোনও স্নারপ্রিন্টফ, কোনও স্ট্রিকাট, এমনকি মেমকিও নাও) কল না করে সহজেই এটি করতে পারেন। এটি দরকারী হতে পারে, আপনি যদি এমন কোনও মাইক্রোকন্ট্রোলার বা ওএস কার্নেল প্রোগ্রামিং করছেন যেখানে libc উপলব্ধ নেই say
আপনি যদি এর জন্য গুগল করেন তবে আশেপাশে তেমন কোনও কোড খুঁজে পাওয়া যায় না ancy সত্যিই এটি স্নিপ্রিন্টফ কল করার চেয়ে বেশি জটিল নয় এবং আরও দ্রুত।
#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);
}
এখানে আরেকটি সংক্ষিপ্ততর সংস্করণ। এটি কেবলমাত্র মধ্যবর্তী সূচী ভেরিয়েবল আই এবং ডুপ্লিকেট করা লাস্ট কেস কোডটি এড়িয়ে যায় (তবে শেষের অক্ষরটি দুটি বার লেখা হয়)।
#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]);