Đối với hoàn chỉnh, bạn cũng có thể dễ dàng làm điều đó mà không cần gọi bất kỳ hàm thư viện nặng nào (không có snprintf, không có strcat, thậm chí không phải memcpy). Nó có thể hữu ích, giả sử nếu bạn đang lập trình một số vi điều khiển hoặc nhân hệ điều hành mà libc không có sẵn.
Không có gì thực sự ưa thích, bạn có thể tìm thấy mã tương tự xung quanh nếu bạn google cho nó. Thực sự nó không phức tạp hơn nhiều so với gọi snprintf và nhanh hơn nhiều.
#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);
}
Đây là một phiên bản khác ngắn hơn một chút. Nó chỉ tránh biến chỉ số trung gian i và sao chép mã trường hợp laste (nhưng ký tự kết thúc được viết hai lần).
#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);
}
Dưới đây là một phiên bản khác để trả lời một bình luận nói rằng tôi đã sử dụng một "thủ thuật" để biết kích thước của bộ đệm đầu vào. Thực ra đó không phải là một thủ thuật mà là một kiến thức đầu vào cần thiết (bạn cần biết kích thước của dữ liệu mà bạn đang chuyển đổi). Tôi đã làm rõ hơn điều này bằng cách trích xuất mã chuyển đổi sang một hàm riêng biệt. Tôi cũng đã thêm mã kiểm tra ranh giới cho bộ đệm đích, điều này không thực sự cần thiết nếu chúng ta biết mình đang làm gì.
#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]
phải được đúc đểunsigned char
, hoặc nó sẽ tràn nếubuf[i] > 127
, đó là:buf_ptr += sprintf(buf_ptr, "%02X", (unsigned char)buf[i]);