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

如果以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= '\012'     八进制整数12

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

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

%02hhX的更多相关文章

  1. 格式化输出%02hhx

    每次看到人家的十六进制输出,对齐的很好,ff就显示了,而我的总是0xffffffff.如果是"%02x",是以0补齐2位数,如果超过2位就显示实际的数:"%hhx&quo ...

  2. [转载]iOS 10 UserNotifications 框架解析

    活久见的重构 - iOS 10 UserNotifications 框架解析 TL;DR iOS 10 中以前杂乱的和通知相关的 API 都被统一了,现在开发者可以使用独立的 UserNotifica ...

  3. iOS 10 UserNotifications 框架解析

    摘自:https://onevcat.com/2016/08/notification/ iOS 10 中以前杂乱的和通知相关的 API 都被统一了,现在开发者可以使用独立的 UserNotifica ...

  4. C++中关于类型转换的问题讨论

    这里以signed/unsigned char, signed/unsigned short, signed/unsigned int类型为例, 讨论一下基本类型转换的基本原理,这样我们在编程中碰到由 ...

  5. C语言学习笔记--类型定义&联合

    一.类型定义 C语言自定义数据类型 (typedef) C语言提供一个叫做typedef的功能来声明一个已有的数据类型的新名字. typedef int Length; 使得Length成为int类型 ...

  6. swift 获取文件的Md5值

    获取文件的Md5值的方法如下 func md5File(url: URL) -> String? { let bufferSize = 1024 * 1024 do { //打开文件 let f ...

  7. 听翁恺老师mooc笔记(13)--类型定义和联合

    typedef 虽然我们知道使用struct这个关键字定义一个结构类型,然后可以使用该结构类型定义变量.但是每次要使用的时候都需要带着struct这个关键字,那么如何摆脱这个关键字哪?C语言提供了一个 ...

  8. [C语言]进阶|结构类型: 枚举, 结构, 类型定义

    --------------------------------------------------------------------- 枚举: // main.c #include <std ...

随机推荐

  1. 4、在Shell程序中的使用变量

    学习目标变量的赋值变量的访问变量的输入 12-4-1 变量的赋值在Shell编程中,所有的变量名都由字符串组成,并且不需要对变量进行声明.要赋值给一个变量,其格式如下:变量名=值.注意:等号(=)前后 ...

  2. 深入理解Solaris X64系统调用

    理解系统调用的关键在于洞悉系统调用号是联系用户模式与内核模式的纽带.而在Solaris x64平台上,系统调用号被保存在寄存器RAX中,从用户模式传递到内核模式.一旦进入内核模式,内核的sys_sys ...

  3. java--多线程之后台线程

    public class ThreadDaemon { /** * @param args * 后台线程在主进程结束后,也会退出 */ public static void main(String[] ...

  4. .netCore2.0 部分视图ViewComponent

    .netCore 中部分视图相当于轻量级的控制器,建立方法类似控制器,需要建立文件夹Components,然后再建立视图组件控制器,规则和视图控制器类似,默认结尾为ViewComponent,如Abc ...

  5. [转]前端构建工具gulpjs的使用介绍及技巧

    本文转自:http://www.cnblogs.com/2050/p/4198792.html gulpjs是一个前端构建工具,与gruntjs相比,gulpjs无需写一大堆繁杂的配置参数,API也非 ...

  6. [转]时序列数据库武斗大会之什么是TSDB

    由于工作上的关系,最近看了一些关于时序列数据库的东西,当然,我所看的也都是以开源方案为主. 趁着这股热劲还没退,希望能整理一些资料出来.如果正好你也有这方面的需求,那么希望这一系列的介绍能够帮助到你. ...

  7. jQuery 整体架构

    不同于 jQuery 代码各个模块细节实现的晦涩难懂,jQuery 整体框架的结构十分清晰,按代码行文大致分为如上图所示的模块. 初看 jQuery 源码可能很容易一头雾水,因为 9000 行的代码感 ...

  8. js跳转指定的网站

    $(function () {window.location.replace("http:new.mingyikanya.com");});

  9. ASP.NET MVC4 新手入门教程之九 ---9.查询详情和删除方法

    在本教程的这一部分,您会检查自动生成的Details和Delete方法. 检查详细信息和删除方法 打开Movie控制器并检查的Details的方法. public ActionResult Detai ...

  10. CXF - 拦截器获取调用方法

    没想到要弄这么一个东西. 起初只是想用interceptor记录一下webservice调用日志,后来却被要求在页面展示. 展示容易,但只是展示webservice的地址无法让用户从中明白什么. 那么 ...