hexdump与xxd格式的区别


9

我在搜索如何进行反向十六进制转储,发现提到了xxd。但是,它似乎不能简单地使用:

xxd -r hexdumpfile > binaryfile

然后,我比较了xxd infile和的输出之间的差异hexdump infile,发现了三个差异:

  1. xxd输出的地址后面有一个冒号
  2. xxd输出在数据中的位置相反(例如,十六进制转储输出在xxd输出中5a42变为425a
  3. 每行后面有一些额外的字符

我在服务器上只有某些文件的十六进制版本。如何使用xxd正确取回二进制数据?


一直在寻找xxd中的一些选项以采用hexdump格式,但是目前,它已经通过一些简单的sed操作做到了这一点
tanon 2011年

我还没有真正精确地测试您的要求,但是尝试xxd -p和-b,-p是普通的-b是二进制的,以及您的-r。至于字节顺序,这与大字节序和小字节序有关,也许xxd不能将其反转..但这与字节在文件中的存储方式有关。例如,如果记事本中有文本文件,您可以将其另存为Unicode 16位大字节序,小字节序或UTF-8或其他格式,您会发现它与xxd有所不同。od命令可能会显示不同的内容。
barlop

供以后参考,hexdump允许您选择在其输出中使用的字节序,这可以使此过程更简单。(为什么?现在发现您的问题对不相关的问题有所帮助。)
jpaugh

Answers:


7

据我所知,没有一个命令可以进行转换,但是可以很容易地将其分解为几个步骤:

  1. hexdump使用以下命令从输出中剥离地址sed
  2. 使用转换为二进制 xxd
  3. 尾数转换(例如,5a42变为425a)使用dd

这是完整的命令:

sed 's/^[0-9]*//' hexdump | xxd -r -p | dd conv=swab of=binaryfile

如果hexdump以0a
结尾不起作用

1

这个答案来自https://stackoverflow.com/a/52834021/6770384

您可以通过一个sed命令进行转换。:在地址之后添加after并更改字节序就足够了(切换ab1212ab)。

sed -E 's/ /: /;s/ (..)(..)/ \2\1/g;$d' dump | xxd -r

已知错误(请参阅评论部分)

  • 如果原始文件的长度为奇数(例如1、3、5、7,...,字节长),则添加尾随的空字节。
  • 如果hexdump使用来编辑  原始文件的重复部分,则无法正确还原这些部分*

如果hexdump以0a
结尾不起作用

@Smeterlink谢谢您的观察!您说对了:如果以字节为单位的长度为奇数,此命令将产生一个尾随的空字节,该字节不在原始文件中。我还发现了另一个错误。hexdump可能会使用来隐藏重复的部分*。此命令也无法正确还原这些部分。例如:yes | head -n100 | hexdump | sed -E 's/ /: /;s/ (..)(..)/ \2\1/g' | xxd -r只打印8张y而不是100张。解决这些问题将需要的不仅是这种单线。也许将来我会添加另一个脚本。
Socowi

谢谢*小费,不知道!
Smeterlink
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.