zoukankan      html  css  js  c++  java
  • %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进制形式,不过要注意 字节序问题。

  • 相关阅读:
    670. Maximum Swap
    653. Two Sum IV
    639. Decode Ways II
    636. Exclusive Time of Functions
    621. Task Scheduler
    572. Subtree of Another Tree
    554. Brick Wall
    543. Diameter of Binary Tree
    535. Encode and Decode TinyURL
    博客园自定义背景图片
  • 原文地址:https://www.cnblogs.com/blueyunchao0618/p/5715285.html
Copyright © 2011-2022 走看看