• %02hhX


    大家经常会遇到将 调试信息例如从网络收到的数据包 或者 转换后的数据 打印出来,调试问题。

    如果以ascii码打印的话,控制字符和ascii码以外的字符不能很好的查看具体值(看不到,或者乱码,尤其对于网络报文)。

    如果以16进制形式打印出来,就避免了这个问题。

    输出的格式经常不标准,对于一个字节 有时占1个字节空间7F,有时占8个字节空间FFFFFFFE。

    现在就告诉大家一个标准的格式,不用考虑,内存空间是 有符号的字符串,还是无符号的字符串,亦或是 类型转换等。

    char *src;

    printf("%02hhX", src);

    hh 标示以一个字节char类型打印值。类似于h标示以一个short类型打印值一样。(事实上就是内存空间的大小不一样而已,char,short,int 如果都是无符号数,标示的值一样,仅仅所占空间大小不同)

    %X标示以16进制形式打印一个整数(int ,四个字节),对于unsigned或者signed的int来说,内存中存储的值一样,只是表示的值不一样而已。

    举个例子,一个char  类型存储的值为 0xFF,二进制就是8个位都是1, unsigned 标示 255,signed 标示 -1。

    hh和X组合标示 以一个char类型打印一个整数,将四个字节的整数截断成一个字节打印出来。

    02 不够2位的前边补0 补成两位打印出来,超过2位的以实际长度打印出来,

    对于%02hhx,hhx已经以一个字节打印了,加上02限制,不够两位的补成两位。

    对于:

    char a = 'xAB';

    printf("%02X", a);    //FF FF FF AB(最高位为1,符号扩展前面都补1, FF FF FF AB)

    unsigned char a = 'xAB';

    printf("%02X", a);    //AB(无符号char,前面补0,实际上打印的值还是四个字节00 00 00 AB,只是前面都是0,所以以2位显示出来而已)

    所以 优选 %02hhX打印。

    说明:以上一个int占4个字节,是在32位系统上。

    %X以大写字母打印十六进制

    %x以小写字母打印十六进制

    char a = '12'     八进制整数12

    char a= '12'     八进制整数12

    char a='x12'  十六进制整数12

    linux 中有个 hexdump 打印文件的16进制形式,不过要注意 字节序问题。

  • 相关阅读:
    HackingLab-据说MD5加密很安全,真的是么
    HackingLab-猜猜这是经过了多少次加密
    MySQL8.0安装
    fastdfs 单节点部署多目录
    关于ssh密钥配置还需要输入密码的终极解决办法
    VMware 配置虚拟机NAT 方式上网
    redis bind的正确配置
    filebeat修改索引名字
    zabbix-server卡死不动
    ssh免秘钥快速配对。
  • 原文地址:https://www.cnblogs.com/blueyunchao0618/p/5715285.html
Copyright © 2020-2023  润新知