• 常用工具:16进制宏定义--有注解


    #define HexPrint(_buf, _len) {\
        int _m_i = 0;\
        char *_m_buf = (char *)(_buf);\
        int _m_len = (int)(_len);\
        time_t currentTime = time(NULL);\
        struct tm* localTime = localtime(&currentTime);\
        char timeStr[100]={0};\
        strftime(timeStr, sizeof(timeStr), "%Y-%m-%d %H:%M:%S", localTime);\
        printf("[%s][%s:%d] \r\n", timeStr,__FUNCTION__, __LINE__);\
        printf("*****************************\n");\
        for(_m_i = 0; _m_i < _m_len; _m_i++)\
        {\
            printf(YELLOW "%02x " NONE, _m_buf[_m_i] & 0xff);\
            if(!((_m_i+1) % 10)) printf("\n");\
        }\
        printf("\nsize = %d\n*****************************\n", _m_len);\
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    #define HexPrint(_buf, _len) {\
        int _m_i = 0; // 定义循环变量_m_i,用于遍历缓冲区
        char *_m_buf = (char *)(_buf); // 将传入的缓冲区转换为字符型指针_m_buf
        int _m_len = (int)(_len); // 将传入的长度转换为整型变量_m_len
        time_t currentTime = time(NULL); // 获取当前时间的时间戳
        struct tm* localTime = localtime(&currentTime); // 将时间戳转换为本地时间结构体指针localTime
        char timeStr[100]={0}; // 定义存储格式化时间字符串的字符数组timeStr
        strftime(timeStr, sizeof(timeStr), "%Y-%m-%d %H:%M:%S", localTime); // 格式化时间字符串并存储到timeStr数组中
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    以上是对给定代码宏定义的注释,它定义了一个名为HexPrint的宏。在宏定义中,声明了一些局部变量,并获取了当前时间,并将其格式化为字符串形式存储在timeStr中。但是,在提供的代码片段中,没有显示宏的后续部分,因此无法确定该宏在后续代码中是否被使用。如果提供宏的完整代码,我可以提供更具体的帮助和解释。

    printf("[%s][%s:%d] \r\n", timeStr, __FUNCTION__, __LINE__);
    
    • 1

    这行代码使用printf函数打印了一个格式化的字符串。它包含以下内容:

    • [%s]:用于打印时间字符串,使用变量timeStr作为参数。
    • [%s:%d]:用于打印函数名称和行号。__FUNCTION__是一个预定义的宏,表示当前所在的函数名;__LINE__也是一个预定义的宏,表示当前所在的行号。

    通过在printf函数中使用这些格式说明符和相应的变量,可以打印出类似[2024-02-23 12:34:56][function_name:42]的日志信息,其中时间、函数名和行号会根据实际情况进行替换。这种技巧通常用于调试和记录日志时,方便追踪代码执行流程和定位问题。

    for (_m_i = 0; _m_i < _m_len; _m_i++)\
    {\
        printf(YELLOW "%02x " NONE, _m_buf[_m_i] & 0xff); // 打印缓冲区中的字节,使用黄色显示
        if (!((_m_i + 1) % 10)) printf("\n"); // 每打印10个字节后换行
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    这段代码是一个for循环,用于遍历缓冲区并打印其中的字节。具体的操作包括:

    • printf(YELLOW "%02x " NONE, _m_buf[_m_i] & 0xff):打印缓冲区中当前字节的值,使用黄色作为输出颜色。
    • if (!((_m_i + 1) % 10)) printf("\n"):当已经打印了10个字节后,进行换行操作。

    通过这段代码,可以将缓冲区中的字节按照每行10个字节的格式打印出来,以便查看和调试。在打印字节之前,使用YELLOW宏定义的黄色进行修饰,使得打印的字节在终端中以黄色显示。

    在这个上下文中,%02x0xff都是与十六进制数值相关的表达式。

    • %02x是一个格式说明符,在printf函数中用于打印无符号整数以十六进制形式显示,并保持至少两位宽度。其中,%02x表示使用两位字符来显示一个无符号整数的十六进制值,不足两位时在前面补零。
    • 0xff是一个十六进制字面量,表示十六进制数255的值。在这段代码中,0xff被用作掩码操作,通过与缓冲区中的字节按位与运算(_m_buf[_m_i] & 0xff),可以确保只取低8位的值,忽略高8位。

    综合起来,%02x用于将缓冲区中的字节按照两位宽度的十六进制形式打印出来,而0xff则是用作掩码操作,确保只取低8位的值进行打印。

  • 相关阅读:
    Vue3的其他组和API—— toRaw与markRaw、customRef、 provide 与inject
    风控决策流程的优化与规则调优
    Notepad++的全局环境变量
    Qt的容器
    Selenium结合Jenkins进行持续集成
    集团管理者培训大会-总结
    如何在微信小程序中集成认证服务—邮箱地址篇
    vivo 网络端口安全建设技术实践
    某势科技笔试题
    小型框架集合
  • 原文地址:https://blog.csdn.net/m0_46376834/article/details/136248750