linux - 将十六进制转储转换回其原始二进制形式

标签 linux memory embedded-linux dump hexdump

我需要进行反向十六进制转储,将 nvram 内存块十六进制转储转换为二进制文件(.bin)。内存块转储如下所示:

00010000    4293  D306  0123  195A  3360  18EB  66D0  60CB
00010010    E003  68C9  42B9  D1EE  1C0F  2201  4494  4663
00010020    B2DC  1C2B  335C  781B  42A3  D8C6  1C2B  33A0
00010030    1C34  601E  E039  4B21  681B  930A  7822  920B
00010040    8863  88A2  469C  23F8  021B  421A  D001  22A7
.... ....

我应该只使用这个 xxd 命令,而不使用其他选项吗?

xxd -r block.txt block.bin

最佳答案

你可以尝试一下。我做了以下测试:

$ echo "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed" | xxd
0000000: 4c6f 7265 6d20 6970 7375 6d20 646f 6c6f  Lorem ipsum dolo
0000010: 7220 7369 7420 616d 6574 2c20 636f 6e73  r sit amet, cons
0000020: 6563 7465 7475 7220 6164 6970 6973 6369  ectetur adipisci
0000030: 6e67 2065 6c69 742c 2073 6564 0a         ng elit, sed.

如您所见,它与您的输入有所不同,因此我做了一些修改:

$ echo "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed" | xxd -u |
sed 's/^\(.\{48\}\).*$/\1/1; s/\(\S\s\)\(\S\)/\1 \2/g; s/:/  /;'
0000000    4C6F  7265  6D20  6970  7375  6D20  646F  6C6F
0000010    7220  7369  7420  616D  6574  2C20  636F  6E73
0000020    6563  7465  7475  7220  6164  6970  6973  6369
0000030    6E67  2065  6C69  742C  2073  6564  0A       

这与您所拥有的非常相似。现在我将尝试恢复该状态:

$ echo "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed" | xxd -u |
sed 's/^\(.\{48\}\).*$/\1/1; s/\(\S\s\)\(\S\)/\1 \2/g; s/:/  /;' | xxd -r
xxd: sorry, cannot seek backwards.

这太糟糕了。因此,我们将尝试恢复更改,以便为 xxd -r 获得合适的输入:

$ echo "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed" | xxd -u |
sed 's/^\(.\{48\}\).*$/\1/1; s/\(\S\s\)\(\S\)/\1 \2/g; s/:/  /;' |
sed 's/\s\+/ /g; s/^\(\S\+\)\s/\1: /'
0000000: 4C6F 7265 6D20 6970 7375 6D20 646F 6C6F
0000010: 7220 7369 7420 616D 6574 2C20 636F 6E73
0000020: 6563 7465 7475 7220 6164 6970 6973 6369
0000030: 6E67 2065 6C69 742C 2073 6564 0A 

而且,至少对于这个例子来说,它是有效的:

$ echo "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed" | xxd -u |
sed 's/^\(.\{48\}\).*$/\1/1; s/\(\S\s\)\(\S\)/\1 \2/g; s/:/  /;' |
sed 's/\s\+/ /g; s/^\(\S\+\)\s/\1: /' | xxd -r
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed

总而言之,您可以尝试以下操作:

sed 's/\s\+/ /g; s/^\(\S\+\)\s/\1: /' block.txt | xxd -r > block.bin

关于linux - 将十六进制转储转换回其原始二进制形式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33426353/

相关文章:

c++ - qdbusxml2cpp 无法正常工作

linux - 如何将自定义身份验证插入 Linux?

linux - 使用 ncftp 从远程 ftp 删除超过 7 天的备份

c - 线程堆栈分配

c++ - 如何修复在 Linux 内核 SPI 驱动程序中始终无法通过验证的 SPI 驱动程序

memory-management - Linux 内核启动 : how is memory allocation done when DTB and initramfs are initially in memory?

linux - GIT不同的 merge 结果与不同的GIT版本

linux - Windows 和 Linux 的 postgres 转储是否不同?

java - 在二维数组中切换数组大小需要不同的内存量

java - 直接从类调用方法与创建类并调用方法有何不同?