使用Linux命令将十六进制信息转换为二进制

问题描述 投票:0回答:2

我的 Linux 系统上有这个二进制文件...

 udit@udit-Dabba ~ $ cat file.enc
 Salted__s�bO��<0�F���Jw!���]�:`C�LKȆ�l

使用hexdump命令,我看到它的信息是这样的:

 udit@udit-Dabba ~ $ hexdump -C file.enc
 00000000  53 61 6c 74 65 64 5f 5f  1b 73 a1 62 4f 15 be f6  |Salted__.s.bO...|
 00000010  3c 30 cc 46 ee 10 13 11  84 bf 4a 77 21 a4 84 99  |<0.F......Jw!...|
 00000020  0e 5d ef 11 18 3a 60 43  a0 4c 4b 1e c8 86 e6 6c  |.]...:`C.LK....l|
 00000030

现在我在其他系统上得到了一个文件,其内容如下:

 53 61 6c 74 65 64 5f 5f  1b 73 a1 62 4f 15 be f6
 3c 30 cc 46 ee 10 13 11  84 bf 4a 77 21 a4 84 99
 0e 5d ef 11 18 3a 60 43  a0 4c 4b 1e c8 86 e6 6c

我需要从这个十六进制转储中找出完全相同的二进制信息。

我该如何进行?

如果没有任何开关,那么 C 代码也可以正常工作。

(但最好是带有一些开关的 Linux 命令)

限制:

文件中的二进制信息是加密算法的输出,所以内容应该完全匹配...

c command command-line-arguments binaryfiles hexdump
2个回答
239
投票

按照@user786653的建议,使用

xxd(1)
程序:

xxd -r -p input.txt output.bin

0
投票

如果出于某种难以理解的企业原因你不能

sudo apt install xxd
,很容易在Python中重新实现它,如下所示:How to create python bytes object from long hex string? with:

xxd2() ( python -c "import sys;import fileinput;sys.stdout.buffer.write(bytes.fromhex(''.join(fileinput.input(sys.argv[1:]))))" "$@" )

适用于文件和标准输入:

printf 01ab | xxd2 
printf '01 ab' | xxd2

或:

printf 01ab > myfile.hex
xxd2 myfile.hex

这是具有更好缩进的脚本:

import sys
import fileinput
sys.stdout.buffer.write(
    bytes.fromhex(
        ''.join(
            fileinput.input(sys.argv[1:])
        )
    )
)

自Python 3.7以来,

bytes.fromhex
函数会忽略空格和换行符,因此无论格式的缩进细节如何,它都可以工作,根据文档:https://docs.python.org/3.12/library/stdtypes.html#bytes .fromhex

版本 3.7 中的更改:bytes.fromhex() 现在会跳过字符串中的所有 ASCII 空白,而不仅仅是空格。

在 Python 3.12.3、Ubuntu 24.04 上测试。

© www.soinside.com 2019 - 2024. All rights reserved.