一. 缘来缘起

最近,同事遇到一个非常奇怪的问题,花了0.5小时,还没有头绪,而且,越想越奇怪。

我刚好路过,感兴趣地问了一下,然后直接用一个xxd命令搞定问题,于是,皆大欢喜。

二. 奇怪问题

原问题相对复杂,为了便于叙述,我来简化一下问题。

a.txt和b.txt文件内容如下:

咦?这两个文件一模一样啊。但是,问题是,相同程序在读取它们时,出现了不同的结果。

读取a.txt第一行,发现长度为3:#include <fstream>

#include <string>#include <iostream>using namespace std;
int main(){  ifstream in("a.txt");  string filename;  string line;
  if(in) // 有该文件  {    while (getline (in, line)) // line中不包括每行的换行符    {       cout << line.size() << endl;   // 结果为3    }  }  else // 没有该文件  {    cout <<"no such file" << endl;  }
  return 0;}

读取b.txt第一行,发现长度为6:

#include <fstream>#include <string>#include <iostream>using namespace std;
int main(){  ifstream in("b.txt");  string filename;  string line;
  if(in) // 有该文件  {    while (getline (in, line)) // line中不包括每行的换行符    {       cout << line.size() << endl;   // 结果为6    }  }  else // 没有该文件  {    cout <<"no such file" << endl;  }
  return 0;}

真的是非常奇怪啊!相同的文件,相同的读取程序,最后得到的结果居然不一样,究竟是什么原因呢?

很多时候,在开发中,我们会遇到类似问题,各方面现象相互矛盾,所以,有必要找出真象和假象。

三. 大胆假设

根据经验,其实我大概猜到了,原因可能是:a.txt和b.txt并不是真的一样。

上面所看到的一致的现象,只是假象,眼见不一定为实。经验证,果真如此。

四. 小心求证

直接看它们的二进制码吧,方法有很多。本文来介绍一个实用的linux命令,即xxd,来man xxd一下:​​​​​​​

ubuntu@VM-0-15-ubuntu:~$ man xxdXXD(1)                                                                                                  XXD(1)
NAME       xxd - make a hexdump or do the reverse.
SYNOPSIS       xxd -h[elp]       xxd [options] [infile [outfile]]       xxd -r[evert] [options] [infile [outfile]]
DESCRIPTION       xxd  creates  a hex dump of a given file or standard input.  It can also convert a hex dump back to its       original binary form.  Like uuencode(1) and uudecode(1) it allows the transmission of binary data in  a       `mail-safe'  ASCII  representation, but has the advantage of decoding to standard output.  Moreover, it       can be used to perform binary file patching.

可以看到,xxd命令可以输出十六进制码,也可以做相反的操作。

直接来看xxd命令的结果:​​​​​​​

ubuntu@VM-0-15-ubuntu:~$ xxd a.txt00000000: 6162 63                                  abcubuntu@VM-0-15-ubuntu:~$ xxd b.txt00000000: efbb bf61 6263                           ...abcubuntu@VM-0-15-ubuntu:~$

果然,他们的二进制层面是不一致的,也就是说,a.txt和b.txt只是看起来一样,像个双胞胎,但本质并不一样。

为什么会这样呢?因为文件编码格式不同,有兴趣的朋友,可以去了解下BOM编码。那么,怎样构造BOM编码的文件呢?

编辑器都有"另存为"功能,直接把文件存为BOM编码格式,然后文件头就会多出ef bb bf,google一下,可以搜到更多有用信息:

找到了问题,解决起来就简单多了,直接统一为无BOM编码的格式即可。

顺便介绍另一个linux命令,即hexdump,它也可达到类似效果,如下:​​​​​​​

ubuntu@VM-0-15-ubuntu:~$ hexdump a.txt0000000 61 62 63                                       0000003ubuntu@VM-0-15-ubuntu:~$ hexdump b.txt 0000000 ef bb bf 61 62 63                              0000006ubuntu@VM-0-15-ubuntu:~$

五. 最后的话

在实际工作中,熟练掌握各种调试工具,尤为重要。大胆假设,小心求证。关于linux的xxd命令,先介绍到这里。

后续也会更多地分享实战调试经验,秒杀bug, 希望大家一起进步。一个命令,节省0.5小时,这样才能少加班哈。

这篇文章,很简单,重要的不是结论具体是什么,而是解决问题的过程和方法。

妙用xxd命令,节省0.5小时相关推荐

  1. vim xxd命令查看二进制文件内容

    使用xxd命令查看xxx.img内容 vim -b xxx.img 默认是乱码,输入命令 :%!xxd 就可以看到内容了. 如果想看文件的开头部分,请输入命令 :0 想直接跳到文件的尾部,请输入命令 ...

  2. Linux xxd命令详解

    xxd命令可以为给定的标准输入或者文件做一次十六进制的输出,它也可以将十六进制输出转换为原来的二进制格式,即将任意文件转换为十六进制或二进制形式 如果没有给定输入文件,标准输入就作为输入文件infil ...

  3. 【linux】 xxd命令功能

    参考自:<Linux 命令xxd输出十六进制> <Python实现Linux命令xxd -i功能> Linux下的xxd命令,能将一个给定文件或标准输入转换为十六进制形式,也能 ...

  4. xxd命令(反编译、二进制文件转十六进制文件)

    xxd命令转换二进制文件为十六进制文件 xxd 1.bin > 2.txt 生成二进制文件可以用vi 查看. 如何把16进制文件还原回二进制文件: xxd -r 2.txt 1.bin xxd ...

  5. linux命令实例教程,Linux xxd命令入门示例教程

    你是否需要使用二进制或十六进制格式显示文件内容? 寻找可以执行此操作的命令行实用程序? 那,你很幸运,因为存在一个名为xxd的命令可以为你做到这一点. 在本教程中,我们将使用一些易于理解的示例来讨论x ...

  6. xxd命令转换二进制十六进制文件

    Linux下的xxd命令,可以把文件在二进制和十六进制之间互相转换. 1.准备需要转换的二进制文件 这个二进制文件可以是任意格式的, 示例中我们创建一个txt格式的二进制文件, vi demo.txt ...

  7. 网友爆料奇葩leader:日报要精确到0.5小时,每晚检查!每周写周计划,评审ABCD等级,午休不许刷手机、看视频、玩游戏!...

    这样的leader你能接受吗? 一位网友吐槽: 一个团队6个人,加上leader一共7个人.leader要求每天写日报,并且要精确到0.5小时,格式必须正确,每天晚上都看,下班后各种问进度.每周一要写 ...

  8. Linux超级强大的十六进制dump工具:XXD命令,我教你应该如何使用!

    在Linux操作系统中,XXD是一个十六进制dump工具,可以将二进制文件转换为十六进制表示,并以可读的形式显示.XXD命令可用于显示文件内容.编辑文件等用途.本文将介绍如何在Linux中使用XXD命 ...

  9. 常用配置及命令V1.0

    常用配置及命令V1.0 常用配置及命令V1.0 docker 安装ElasticSearch|Kibana Oracle命令 docker 安装nacos redis中的常用命令 nginx常用命令 ...

最新文章

  1. ORACLE的impdp和expdp命令
  2. linux memcached php 整合
  3. 安装配置Statspack
  4. 铺地毯pascal程序
  5. Hey, Apple | Decode the Week
  6. str045漏洞提权linux,Linux运维知识之CVE-2016-5195 Dirtycow: Linux内核提权漏洞
  7. VMware连续三年获评Gartner广域网边缘基础设施魔力象限领导者
  8. windows 安装apex_Nvidia Apex安装
  9. Postman离线安装包
  10. 地址栏 输入 参数 刷新参数丢失_Java 编程技巧:如何实现参数的输入输出?
  11. Ubuntu 安装 gcc 过程
  12. DXperience-7.1.1 Sources 源代下载
  13. 继承ActionSupport例子展示
  14. Oracle 查看表空间的使用情况SQL语句
  15. C语言判断闰年计算某月的天数代码
  16. 恒讯科技分析:香港服务器有效防止DDos攻击的3种方法
  17. 陈强老师公开课笔记3——中介效应的Stata操作
  18. @Deprecated注解功能
  19. go IO操作-文件读
  20. 前端性能优化的七种方法

热门文章

  1. Windows11 的体验
  2. NR HARQ (四)dynamic codebook
  3. 考虑延迟环节的电流环设计
  4. 基于FPGA的NCO设计方案
  5. linux应用端口的网络超时,Linux服务器可以ping,但是telnet端口超时,网站wget超时,访问超时的解决办法...
  6. Android CardView卡片
  7. 利用FloatingActionButton实现底部凸起的导航栏
  8. 【微服务】RPC、gRPC 和 C/S 架构的基本实现(Golang)
  9. 原生js实现吸取图片颜色
  10. 备用内存 释放_内存备用太多了怎么办