今天给大家介绍一个非常有效的打印字节数组的函数,它的显示方式跟Linux命令行的hexdump的输出非常类似。
先给大家上一个效果图:
它的输出分为三部分:字节偏移量、16进制字节数据、ASCII码可显字符;
其中ASCII部分,如果对应的字节是非可显字符,则用.代替。
立马送上它的函数实现:
#include
#include
int log_hexdump(const char *title, const unsigned char *data, int len)
{
char str[160], octet[10];
int ofs, i, k, d;
const unsigned char *buf = (const unsigned char *)data;
const char dimm[] = "+------------------------------------------------------------------------------+";
printf("%s (%d bytes):\r\n", title, len);
printf("%s\r\n", dimm);
printf("| Offset : 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 0123456789ABCDEF |\r\n");
printf("%s\r\n", dimm);
for (ofs = 0; ofs < (int)len; ofs += 16) {
d = snprintf( str, sizeof(str), "| %08X: ", ofs );
for (i = 0; i < 16; i++) {
if ((i + ofs) < (int)len) {
snprintf( octet, sizeof(octet), "%02X ", buf[ofs + i] );
} else {
snprintf( octet, sizeof(octet), " " );
}
d += snprintf( &str[d], sizeof(str) - d, "%s", octet );
}
d += snprintf( &str[d], sizeof(str) - d, " " );
k = d;
for (i = 0; i < 16; i++) {
if ((i + ofs) < (int)len) {
str[k++] = (0x20 <= (buf[ofs + i]) && (buf[ofs + i]) <= 0x7E) ? buf[ofs + i] : '.';
} else {
str[k++] = ' ';
}
}
str[k] = '\0';
printf("%s |\r\n", str);
}
printf("%s\r\n", dimm);
return 0;
}
int main(int argc, const char *argv[])
{
unsigned char test_buf[12] = {3 , 6, 7, 9, 234, 67, 77};
char *msg_ch = "我是一个中文字符串";
char *msg_en = "I am english string";
log_hexdump("test_buf", test_buf, sizeof(test_buf));
log_hexdump("msg_ch", msg_ch, strlen(msg_ch));
printf("msg_ch: %s\r\n\r\n\r\n", msg_ch);
log_hexdump("msg_en", msg_en, strlen(msg_en));
printf("msg_en: %s\r\n\r\n\r\n", msg_en);
return 0;
}
调用代码也很简单,就像上面的main函数调用一样。
好了,这个使用的打印函数就介绍到这里,感兴趣的可以研究下它的源码,希望能够帮助到你。
审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
Linux
+关注
关注
87文章
11219浏览量
208872 -
字节
+关注
关注
0文章
39浏览量
13717 -
函数
+关注
关注
3文章
4303浏览量
62409 -
RT-Thread
+关注
关注
31文章
1271浏览量
39902
发布评论请先 登录
相关推荐
RT-Thread 应用笔记 - RTC Alarm 组件的使用
RT-Thread 应用笔记 - 不正确使用LOG也会引发hard faultRT-Thread 应用笔记 - RTC Alarm 组件的使用RT-
发表于 01-25 18:18
•10次下载
RT-Thread 内核学习笔记 - 理解defunct僵尸线程
RT-Thread 内核学习笔记 - 内核对象rt_objectRT-Thread 内核学习笔记
发表于 01-25 18:19
•8次下载
RT-Thread 内核学习笔记 - 设备模型rt_device的理解
RT-Thread 内核学习笔记 - 内核对象rt_objectRT-Thread 内核学习笔记
发表于 01-25 18:19
•8次下载
RT-Thread 内核学习笔记 - 内核对象链表结构深入理解
RT-Thread 内核学习笔记 - 内核对象rt_objectRT-Thread 内核学习笔记
发表于 01-25 18:23
•6次下载
RT-Thread 内核学习笔记 - 内核对象初始化链表组织方式
RT-Thread 内核学习笔记 - 内核对象rt_objectRT-Thread 内核学习笔记
发表于 01-25 18:24
•3次下载
RT-Thread学习笔记分享
我是从2020年11月初开始学习RT-Thread实时操作系统的,在学习RT-Thread之前,我接触过uCOS和FreeRTOS,但这两个在单片机上应用的实时操作系统,我都没有仔细并
RT-Thread学习笔记 RT-Thread的架构概述
RT-Thread 简介 作为一名 RTOS 的初学者,也许你对 RT-Thread 还比较陌生。然而,随着你的深入接触,你会逐渐发现 RT-Thread 的魅力和它相较于其他同类型 RTOS
评论