做开发,尤其是嵌入式开发,要不过去过去曾经,要不现在,或者将来一定会遇到十六进制字符串和二进制文件之间转换的操作。

像这样的情形:

  1. 有一个十六进制字符串,需要转换为二进制文件
  2. 有一个二进制文件,需要转换为十六进制数组
  3. 有一个十六进制数组,需要转换为二进制文件;
  4. 有一个二进制文件,需要转换为十六进制字符串;

最多就是前两种情形。不管你是不是经常遇到,反正我是。

以前到处搜,没找到中意的,后来干脆自己用python写了个脚本将二进制转数组。到后来发现,都是浪费时间,linux自带工具就能满足这样的需求,甚至更多。

好吧,废话不多说了。一句话,命令行工具xxd能让你实现这种自由。要是觉得太啰嗦,还请直接转到第7节看总结。

1. 十六进制字符串转换为二进制文件

  • 例一

我有一个十六进制字符串,包含字母数字大小写,想转换成二进制文件。

# 字符串: ABCDEF0123456789abcdef0123456789# 1. 转换
$ echo -n "ABCDEF0123456789abcdef0123456789" | xxd -r -ps > test11.bin# 2. 检查
$ xxd -g 1 test11.bin
0000000: ab cd ef 01 23 45 67 89 ab cd ef 01 23 45 67 89  ....#Eg.....#Eg.
  • 例二

例一中的情形太简单了,上个复一点的,这次是完整的十六进制字符串,字符带有0x前缀,还有空格,想转换成二进制文件。

# 字符串: 0xAB 0xCD 0xEF 0x01 0x23 0x45 0x67 0x89 0xAB 0xCD 0xEF 0x01 0x23 0x45 0x67 0x89# 转换
$ echo -n "0xAB 0xCD 0xEF 0x01 0x23 0x45 0x67 0x89 0xAB 0xCD 0xEF 0x01 0x23 0x45 0x67 0x89" | xxd -r -ps > test12.bin# 检查
$ xxd test12.bin
0000000: abcd ef01 2345 6789 abcd ef01 2345 6789  ....#Eg.....#Eg.
  • 例三

升级版,这次的字符串中不仅有0x前缀,带空格,还有逗号","分割,一样不在话下:

# 字符串: "0xAB, 0xCD, 0xEF, 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, 0x01, 0x23, 0x45, 0x67, 0x89"# 转换
$ echo -n "0xAB, 0xCD, 0xEF, 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, 0x01, 0x23, 0x45, 0x67, 0x89" | xxd -r -ps > test13.bin# 检查
$ xxd test13.bin
0000000: abcd ef01 2345 6789 abcd ef01 2345 6789  ....#Eg.....#Eg.

就一条命令,带有字母数字大小写,带空格0x前缀和逗号的字符串,通通一行搞定,就问你服不服。

2. 二进制文件转换成十六进制数组

用到这个操作的地方实在是太多了,常常需要将各种点阵字库,各种图片,各种固件转换成代码。

So easy! 一秒搞定!

  • 例四

把前面例一中的二进制文件转换成数组。

方式一:

# 文件
$ xxd -g 1 test11.bin
0000000: ab cd ef 01 23 45 67 89 ab cd ef 01 23 45 67 89  ....#Eg.....#Eg.# 数组
$ xxd -i test11.bin
unsigned char test11_bin[] = {0xab, 0xcd, 0xef, 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0x01,0x23, 0x45, 0x67, 0x89
};
unsigned int test11_bin_len = 16;

方式二:

# 文件
$ xxd -g 1 test11.bin
0000000: ab cd ef 01 23 45 67 89 ab cd ef 01 23 45 67 89  ....#Eg.....#Eg.# 数组
$ xxd -i < test11.bin0xab, 0xcd, 0xef, 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0x01,0x23, 0x45, 0x67, 0x89

这两种方式有点小差别,看出来区别在哪里了吗?不管怎样,就问你爽不爽?

3. 十六进制数组转换成二进制文件

  • 例五

其实这种方式在例三中已经说过了,对头不?

# 从数组中拿到的字符串
$ echo -n "  0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF, 0x00, 0x11, 0x22, 0x33, 0x44, 0x55,0x66, 0x77, 0x88, 0x99, 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF,0xAB, 0xCD, 0xEF, 0x98, 0x76, 0x54, 0x32, 0x10
" | xxd -r -ps > test31.bin# 检查文件
$ hexdump -Cv test31.bin
00000000  aa bb cc dd ee ff 00 11  22 33 44 55 66 77 88 99  |........"3DUfw..|
00000010  01 23 45 67 89 ab cd ef  ab cd ef 98 76 54 32 10  |.#Eg........vT2.|
00000020

4. 二进制文件转换为十六进制字符串

  • 例六

我有个二进制文件,想转换成对应的字符串。

就是把前面例一中的二进制文件还原成字符串

# 二进制文件
$ xxd -g 1 test11.bin
0000000: ab cd ef 01 23 45 67 89 ab cd ef 01 23 45 67 89  ....#Eg.....#Eg.# 转换成小写字符串
$ xxd -ps test11.bin
abcdef0123456789abcdef0123456789# 转换成大写字符串
$ xxd -ps -u test11.bin
ABCDEF0123456789ABCDEF0123456789

5. 更多骚操作,十六进制转二进制位串

  • 例七,查看文件的二进制位串
$ xxd -g 1 test11.bin
0000000: ab cd ef 01 23 45 67 89 ab cd ef 01 23 45 67 89  ....#Eg.....#Eg.
$ xxd -b test11.bin
0000000: 10101011 11001101 11101111 00000001 00100011 01000101  ....#E
0000006: 01100111 10001001 10101011 11001101 11101111 00000001  g.....
000000c: 00100011 01000101 01100111 10001001                    #Eg.$ xxd -g 1 -c 8 test11.bin
0000000: ab cd ef 01 23 45 67 89  ....#Eg.
0000008: ab cd ef 01 23 45 67 89  ....#Eg.
rocky@guyongqiangx:/public/xxd$ xxd -b -c 8 test11.bin
0000000: 10101011 11001101 11101111 00000001 00100011 01000101 01100111 10001001  ....#Eg.
0000008: 10101011 11001101 11101111 00000001 00100011 01000101 01100111 10001001  ....#Eg.

6. 不能再爽了,还能直接修改二进制文件

  • 例八,修改二进制文件

直接以指定偏移量的方式修改文件,下面这个命令将0x12开始的4个字节替换为"0xAA 0xBB 0xCC 0xDD":

# 修改前
$ xxd test31.bin
0000000: aabb ccdd eeff 0011 2233 4455 6677 8899  ........"3DUfw..
0000010: 0123 4567 89ab cdef abcd ef98 7654 3210  .#Eg........vT2.# 替换0x12开始的4个字节为 AA BB CC DD
$ echo -n "0012: AABBCCDD" | xxd -r - test31.bin# 修改后
$ xxd test31.bin
0000000: aabb ccdd eeff 0011 2233 4455 6677 8899  ........"3DUfw..
0000010: 0123 aabb ccdd cdef abcd ef98 7654 3210  .#..........vT2.

命令echo -n "0012: AABBCCDD" | xxd -r - test31.bin中有个小小的-,千万不要漏掉了。

还有,修改前记得要备份!哭的时候,不要说我没提醒过,哈哈哈~~

7. 总结

  • 十六进制字符串转换成二进制文件
$ echo -n "ABCDEF0123456789abcdef0123456789" | xxd -r -ps > test11.bin
  • 二进制文件转换成十六进制数组
$ xxd -i test11.bin
unsigned char test11_bin[] = {0xab, 0xcd, 0xef, 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0x01,0x23, 0x45, 0x67, 0x89
};
unsigned int test11_bin_len = 16;
  • 二进制文件转换成十六进制字符串
$ xxd -ps test11.bin
abcdef0123456789abcdef0123456789

掌握了这3条命令,十六进制和二进制转化,你自由了。

剩下的时间可用来泡妞,可用来划水,可用来摸鱼,还可以用来解更多的bug,这一切的一切,难道不香吗?

xxd工具,你值得拥有。


最近会重新开始更新公众号,所以来一波硬广。

洛奇工作中常常会遇到自己不熟悉的问题,这些问题可能并不难,但因为不了解,找不到人帮忙而瞎折腾,往往导致浪费几天甚至更久的时间。

所以我组建了几个微信讨论群(记得微信我说加哪个群,如何加微信见后面),欢迎一起讨论:

  • 一个密码编码学讨论组,主要讨论各种加解密,签名校验等算法,请说明加密码学讨论群。
  • 一个Android OTA的讨论组,请说明加Android OTA群。
  • 一个git和repo的讨论组,请说明加git和repo群。

在工作之余,洛奇尽量写一些对大家有用的东西,如果洛奇的这篇文章让您有所收获,解决了您一直以来未能解决的问题,不妨赞赏一下洛奇,这也是对洛奇付出的最大鼓励。扫下面的二维码赞赏洛奇,金额随意:

洛奇自己维护了一个公众号“洛奇看世界”,一个很佛系的公众号,不定期瞎逼逼。公号也提供个人联系方式,一些资源,说不定会有意外的收获,详细内容见公号提示。扫下方二维码关注公众号:

别找了,这个命令让你在字符串和十六进制间自由转换相关推荐

  1. sudo找不到命令:修改sudo的PATH路径

    sudo有时候会出现找不到命令,而明明PATH路径下包含该命令,让人疑惑.其实出现这种情况的原因,主要是因为当 sudo以管理权限执行命令的时候,linux将PATH环境变量进行了重置,当然这主要是因 ...

  2. 安装完Hadoop之后,命令行输入hadoop或hdfs却找不到命令的解决方法

    安装完Hadoop之后,命令行输入hadoop或hdfs却找不到命令的解决方法 参考文章: (1)安装完Hadoop之后,命令行输入hadoop或hdfs却找不到命令的解决方法 (2)https:// ...

  3. Linux记录-普通用户下执行sudo xxx 找不到命令解决方案

    Linux记录-普通用户下执行sudo xxx 找不到命令解决方案 参考文章: (1)Linux记录-普通用户下执行sudo xxx 找不到命令解决方案 (2)https://www.cnblogs. ...

  4. “sudo: go:找不到命令”完美解决方案

    当我们配置好go环境,可以正常使用go命令,但是使用 sudo 权限执行 go 命令,出现"sudo: go:找不到命令"时: 解决方案: sudo vim /etc/sudoer ...

  5. 在Ubuntu下输入ifconfig命令返回: ifconfig:找不到命令

    输入之后有错误 shl@shl-tx:~$ sudo ifconfig sudo: ifconfig:找不到命令 网上找了一个解决方式: 设置环境变量,把/sbin加入path就ok了 vi /etc ...

  6. 安装jupyter后,使用时显示找不到命令(command not found)

    原因很简单 详见这篇帖子找不到命令原因 解决方法 首先打开终端,找到jupyter是否存在 发现了jupyter位置,注意bin文件是存放命令的,所以我们把它添加到环境变量 sudo vim /etc ...

  7. nod找不到服务器,node.js – 带有nodejs child_process的ssh,在服务器上找不到命令

    我试图通过nodejs child_process运行一个简单的ssh命令.当我通过nodejs代码运行命令时,它无法说我找不到发送到服务器的命令.当我运行相同的命令时,只需复制&粘贴到我的终 ...

  8. 关于Ubuntu20.04 sudo vi找不到命令解决方法

    在使用vim时,提示 sudo vim 找不到命令,原因是因为没有安装vi,联网后操作. 解决方法: 1.Ctrl + Alt +T 打开终端: 2.输入命令: sudo apt-get instal ...

  9. Linux sudo找不到命令:修改sudo的PATH路径

    为什么80%的码农都做不了架构师?>>>    sudo有时候会出现找不到命令,而明明PATH路径下包含该命令,让人疑惑.其实出现这种情况的原因,主要是因为当 sudo以管理权限执行 ...

最新文章

  1. TCP/IP详解--第十四章
  2. Oracle中decode的使简单例子
  3. 《Linux命令行与shell脚本编程大全 第3版》Shell脚本编程基础---20
  4. 嵌入式Linux全攻略 ACE程序移植过程详细讲解
  5. 最新版安全狗打狗棒法
  6. 剑指offer03-数组中重复的数字(java)|leetcode刷题
  7. highscore软件_软件|标准物质PDF卡片查找HighScore
  8. keil5怎么接入汇编_keil中如何让汇编语言生成hex文件
  9. 基于遗传算法(deap)的配词问题与deap框架
  10. (33)STM32——485实验笔记
  11. oracle销售合同管理,Oracle服务合同管理系统11i
  12. Python3-word文档操作(七):提取word文档中的图片方式一-利用word文档的压缩文件属性
  13. 用SQL实现取员工日工作量和月工作量
  14. 正式开始撰写《产品大师》,经验来自点滴的积累
  15. java上传微博图床_php上传图片到微博图床
  16. Android系统Surface机制的SurfaceFlinger服务简要介绍和学习计划
  17. 气化器中BOG和EAG分别是什么意思?
  18. python计算圆柱体的表面积和体积_java设计:问题是编写程序计算圆柱体的体积和表面积...
  19. Unity3d 2019.3 通过 Ctrl 键让移动是固定步距
  20. 用gd扩展调用imagegrabscreen截图,完全黑屏!允许服务与桌面交互没用!

热门文章

  1. 地铁怎么坐才不能做反_[第一次]第一次一个人坐地铁,我坐反了方向
  2. 2019世界区块链大会•乌镇第2日金句集锦
  3. vivox6android版本5.1,vivo X6的手机系统是什么?vivo X6能升级安卓5.0吗?
  4. PHP文件怎么改tne,修改 · thinkphp6文档 · 看云
  5. 致广大而尽精微,极高明而道中庸
  6. QT5 OpenGL (四, 绘制立体图形)
  7. 金蝶K3生产数据管理模块术语表
  8. bmob php,文档-Bmob移动后端云服务平台
  9. [笔记]新概念英语听力
  10. 一个普通码农的Linux之路