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

发布于 2024-12-11 09:05:26 字数 871 浏览 0 评论 0原文

我的 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 命令)

限制:

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

I have this binary file on my Linux system...

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

Using the hexdump command, I see its information like this:

 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

Now I am given a file on some other system whose contents are like this:

 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

And I need to find out that same exact binary information from this hexdump.

How can I proceed for that?

If there isn't any switch for that then C code will also work fine.

(But a Linux command with some switch is preferable)

Limitation:

The binary information in the file is output of an encryption algorithm, so contents should exactly match...

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

木格 2024-12-18 09:05:26

正如 @user786653 建议的那样,使用 xxd(1) 程序:

xxd -r -p input.txt output.bin

As @user786653 suggested, use the xxd(1) program:

xxd -r -p input.txt output.bin
叹梦 2024-12-18 09:05:26

如果由于某些难以理解的企业原因,您无法sudo apt install xxd,则可以轻松地按照以下方式在Python中重新实现它:如何从长十六进制字符串创建 python 字节对象? 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 上测试。

If for some unfathomably enterprisey reason you can't sudo apt install xxd, it is easy to reimplement it in Python as per: 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:]))))" "$@" )

which works both with files and stdin:

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

or:

printf 01ab > myfile.hex
xxd2 myfile.hex

Here's the script with better indentation:

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

The bytes.fromhex function ignores whitespaces and newlines since Python 3.7, so it works regardless of the indentation details of the format, as per docs: https://docs.python.org/3.12/library/stdtypes.html#bytes.fromhex

Changed in version 3.7: bytes.fromhex() now skips all ASCII whitespace in the string, not just spaces.

Tested on Python 3.12.3, Ubuntu 24.04.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文