优雅地打印 HEX 数据

代码片段。

在调试的时候经常要打印内存里的数据,来看看数据及格式是否在预期范围内;以及在调试二进制协议的时候,经常需要将协议包里的数据打印出来,这个时候就会涉及到 HEX 数据的展示问题。

这篇文章就是展示如何优雅地打印 HEX 数据。

按照 BeyondCompare 形式打印 HEX 数据。



基础版

代码如下:

#define __is_print(ch) ((unsigned int)((ch) - ' ') ' ')void dump_hex(const uint8_t *buf, uint32_t size){    int i, j;

    for (i = 0; i 16)    {        printf("%08X: ", i);

        for (j = 0; j 16; j++)        {            if (i + j             {                printf("%02X ", buf[i + j]);            }            else            {                printf("   ");            }        }        printf(" ");

        for (j = 0; j 16; j++)        {            if (i + j             {                printf("%c", __is_print(buf[i + j]) ? buf[i + j] : '.');            }        }        printf("\n");    }}

测试代码:

int main(void){    uint8_t i, buff[128];

    for (i = 0; i     {        buff[i] = i;    }

    dump_hex((const uint8_t *)buff, sizeof(buff), 16);    return 0;}

测试效果:

00000000: 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F  ................00000010: 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F  ................00000020: 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F   !"#$%&'()*+,-./00000030: 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F  0123456789:;<=>?00000040: 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F  @ABCDEFGHIJKLMNO00000050: 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F  PQRSTUVWXYZ[\]^_00000060: 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F  `abcdefghijklmno00000070: 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F  pqrstuvwxyz{|}~.

升级版

相对基础版本,每行每 8 个数据多增加一个空格,数据展示更加直观。

#define __is_print(ch) ((unsigned int)((ch) - ' ') ' ')

/** * dump_hex *  * @brief dump data in hex format *  * @param buf: User buffer * @param size: Dump data size * @param number: The number of outputs per line *  * @return void*/void dump_hex(const uint8_t *buf, uint32_t size, uint32_t number){    int i, j;

    for (i = 0; i     {        printf("%08X: ", i);

        for (j = 0; j         {            if (j % 8 == 0)            {                printf(" ");            }            if (i + j                 printf("%02X ", buf[i + j]);            else                printf("   ");        }        printf(" ");

        for (j = 0; j         {            if (i + j             {                printf("%c", __is_print(buf[i + j]) ? buf[i + j] : '.');            }        }        printf("\n");    }}

测试结果:

00000000:  00 01 02 03 04 05 06 07  08 09 0A 0B 0C 0D 0E 0F  ................00000010:  10 11 12 13 14 15 16 17  18 19 1A 1B 1C 1D 1E 1F  ................00000020:  20 21 22 23 24 25 26 27  28 29 2A 2B 2C 2D 2E 2F   !"#$%&'()*+,-./00000030:  30 31 32 33 34 35 36 37  38 39 3A 3B 3C 3D 3E 3F  0123456789:;<=>?00000040:  40 41 42 43 44 45 46 47  48 49 4A 4B 4C 4D 4E 4F  @ABCDEFGHIJKLMNO00000050:  50 51 52 53 54 55 56 57  58 59 5A 5B 5C 5D 5E 5F  PQRSTUVWXYZ[\]^_00000060:  60 61 62 63 64 65 66 67  68 69 6A 6B 6C 6D 6E 6F  `abcdefghijklmno00000070:  70 71 72 73 74 75 76 77  78 79 7A 7B 7C 7D 7E 7F  pqrstuvwxyz{|}~.

printf打印二进制_优雅地打印 HEX 数据相关推荐

  1. 打印表格_表格怎么打印出来

    在用Word时,插入了几个图表,排版已经很规矩了,但是打印出来时却发现多了一个新的图表,打印预览也没有这个图表,为什么Word中预览时看不见图表,但是打印时却出现了图表,使用Word做表格怎么打印出来 ...

  2. window.print() 文字过多会打印不全_明天开始打印准考证,你需要注意这些!

    准考证打印时间&登录网址 准考证下载时间:2019年12月14日-23日 唯一下载网址:中国研究生招生信息网(https://yz.chsi.com.cn/) 视频版打印流程 准考证打印超全流 ...

  3. python 程序停止打印日志_优雅停止 SpringBoot 服务,拒绝 kill -9 暴力停止!

    在使用 SpringBoot 的时候,都要涉及到服务的停止和启动,当我们停止服务的时候,很多时候大家都是kill -9 直接把程序进程杀掉,这样程序不会执行优雅的关闭.而且一些没有执行完的程序就会直接 ...

  4. java日志优雅打印格式_优雅编程之日志排查Log4j

    背景 程序开发调试中,不可缺少的便是日志管理,常用的日志管理框架有如下几种: Log4j:Apache Log4j是一个基于Java的日志记录工具.它是由Ceki Gülcü首创的,现在则是Apach ...

  5. 空白世界地图打印版_考研准考证打印什么时候_中国研究生招生信息网官网

    考研准考证打印什么时候_中国研究生招生信息网官网由广东研究生考试网考试快讯栏目由提供,更多关于考研准考证打印入口,广东研究生考试快讯的内容,请关注广东研究生考试频道/广东人事考试网! 2021考研人注 ...

  6. python打印表格_使用 Python 打印漂亮的表格,这两项基本功你可会?

    今天给大家介绍如何在打印字符串时,规则对齐的两种方法,帮助大家在 shell 界面下输出漂亮的表格. 第一种:使用 format 先来看几个小 demo 左对齐 >>>"{ ...

  7. python打印长方形_利用python打印出菱形、三角形以及矩形的方法实例

    前言 本文主要给大家介绍了关于利用python打印出菱形.三角形以及矩形的相关内容,分享出来供大家参考学习,话不多说,来一起看看详细的介绍: 实例代码 #coding:utf-8 rows = int ...

  8. excel怎么设置打印区域_如何设置打印预览,Excel打印功能介绍

    NO.1 打印是制作Excel表格的一种最终输出操作,我们所有的制作都将体现在打印纸上面. 那么如何实现这个功能呢? 通常通过打印按钮来进行操作,下面介绍一下Range对象下面的两个打印相关的方法. ...

  9. python发票打印程序_用python打印正确的票据生成程序

    对于用python编程相对比较陌生,感谢您对我在另一个python项目上的上一个问题提供的所有快速帮助.无论如何,我用python为一个项目编写了一个新程序,该程序生成了一个餐饮场所的账单.这是我下面 ...

最新文章

  1. 大话设计模式之简单工厂模式
  2. python整数类型-Python整数类型(int)详解
  3. Android 获取当前日期距离过期时间的日期差值的完整方法直接使用
  4. U-BOOT介绍以及disk模块源码分析
  5. ASP.NET MVC 3 Beta 发布了
  6. 关于Raspberry Pi,Python等的6本书
  7. 三星发布A60 元气版:骁龙675 售价1499元
  8. C++ wchar_t
  9. Safari new Date()
  10. UTF-8字符集成为Java 18默认字符集?发布周期将至,Java 18现身
  11. 为什么单线程的Redis能够达到百万级的QPS?
  12. 机器学习非平衡数据集概述
  13. html字体加粗代码_9102年了,公众号还不会换字体?
  14. TiDB 在 Cisco Webex 架构中的部署和应用
  15. 等保三级 MySql数据库通用测评知识
  16. 2进制 , 8进制 , 10进制 , 16进制 , 介绍 及 相互转换 及 快速转换的方法
  17. 注册网站域名多少钱_申请域名多少钱
  18. f5 gtm 工作原理_F5 LTM工作原理.ppt
  19. php 鼠标 移动 手型,JS实现的鼠标跟随代码(卡通手型点击效果)
  20. 回归基础:通过亮度恒定性和运动平滑度对光流进行无监督学习

热门文章

  1. BZOJ 1822 Frozen Nova 霜冻新星
  2. MFC DLL 导出函数的定义方式
  3. C#通过对象属性名修改值
  4. jquery 下拉选择框/复选框常用操作
  5. 图解 MongoDB 地理位置索引的实现原理
  6. get请求400错误 vue_vue用get请求,一个很奇怪的现象
  7. Count on a tree SPOJ - COT
  8. python3 + selenium 之窗口切换
  9. MySQL DEBUG_SYNC 的简单分析与测试
  10. HDU 4932 Miaomiao#39;s Geometry(推理)