我想知道是否有任何 Linux 实用程序或过程可以生成普通的二进制转储并将其反转回原始文件(因为xxd
能够通过-r
参数执行此操作)?我已经尝试过xxd
,它可以选择反转到原始文件,但它只打印普通的十六进制转储。
如果上述方法不可能,是否有任何实用程序可以将纯十六进制字符串(示例:)转换hx829jdxkdiei
为纯二进制字符串。在 Windows 上有一些程序,如 010 Editor,但我找不到任何适用于命令行 linux 的程序。
答案1
如果您只想转储为十六进制,我会使用hexdump
, 或xxd
。
但是,您提到了 010 Editor,这是一个十六进制编辑。 Linux 有很多十六进制编辑器。例如,参见Arch wiki 的这一部分, 或者这个维基百科页面。
答案2
您始终可以使用perl
:
perl -ple 'BEGIN{$/=\8} $_=unpack("B*")' < file > file.dump
(B
将 0x1 8 位字节(八位字节)转储为00000001
;替换为b
get 10000000
)
撤销:
perl -pe '$_=pack("B*", $_)' < file.dump > file
例子:
$ printf %s hx829jdxkdiei | perl -ple 'BEGIN{$/=\8}$_=unpack("B*")'
0110100001111000001110000011001000111001011010100110010001111000
0110101101100100011010010110010101101001
$ printf %s hx829jdxkdiei | perl -ple 'BEGIN{$/=\8}$_=unpack("B*")' |
perl -pe '$_=pack("B*", $_)'
hx829jdxkdiei
对于十六进制转储到二进制转储:
$ echo ff0aa0ff | perl -ple '$_=unpack("B*", pack("H*",$_))'
11111111000010101010000011111111
$ printf %s hx829jdxkdiei | xxd -p -c8 | perl -ple '$_=unpack("B*", pack("H*",$_))'
0110100001111000001110000011001000111001011010100110010001111000
0110101101100100011010010110010101101001
对于zsh
,另请参见:
$ string=hx829jdxkdiei
$ set +o multibyte -o extendedglob
$ bin=${string//(#m)?/${(l[8][0])$(( [##2] ##$MATCH ))}}
$ print -r -- $bin
01101000011110000011100000110010001110010110101001100100011110000110101101100100011010010110010101101001
$ print ${bin//(#m)?(#c8)/${(#):-"2#$MATCH"}}
hx829jdxkdiei
在哪里
$(( ##x ))
给出字符的值x
(wchar_t
打开该选项的值multibyte
,否则为字节值)。$(( [##2] expression ))
将算术表达式的结果展开为二进制(不带前缀2#
)。${(l[8][0])param}
l
eft 用 0 将参数扩展填充到长度 8。${(#)param}
输出其值存储在$param
( 的相反$(( ##x ))
)中的字符。