【RT-Thread学习笔记】使用hexdump打印字节数组

描述

​今天给大家介绍一个非常有效的打印字节数组的函数,它的显示方式跟Linux命令行的hexdump的输出非常类似。

先给大家上一个效果图:

RT-Thread

 

它的输出分为三部分:字节偏移量、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;
}
RT-Thread

调用代码也很简单,就像上面的main函数调用一样。


好了,这个使用的打印函数就介绍到这里,感兴趣的可以研究下它的源码,希望能够帮助到你。

​  审核编辑:汤梓红

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分