我有一个上下文,需要在 shell 脚本中将二进制转换为十六进制和十进制,反之亦然。有人可以建议我一个工具吗?
答案1
进行转换相当简单从纯 bash 中的二进制文件(echo
并且printf
是内置函数):
二进制转十进制
$ echo "$((2#101010101))"
341
二进制转十六进制
$ printf '%x\n' "$((2#101010101))"
155
单独使用 bash 返回二进制有点复杂,所以我建议您查看其他答案来解决该问题。
答案2
假设二进制数据是指具有任何可能的字节值(包括 0)的数据,而不是基数为 2 的数字:
转换从二进制、od
(标准)、xxd
(带有vim
) 或perl
'unpack
浮现在脑海中。
od -An -vtu1 # for decimal
od -An -vtx1 # for hexadecimal
xxd -p # for hexa
perl -pe 'BEGIN{$\="\n";$/=\30};$_=unpack("H*",$_)' # like xxd -p
# for decimal:
perl -ne 'BEGIN{$\="\n";$/=\30;$,=" "}; print unpack("C*",$_)'
现在,转换回来到二进制、awk
(标准)xxd -r
或perl
's pack
:
od -tu1
从以上的十进制输出perl
:
LC_ALL=C awk '{for (i = 1; i <= NF; i++) printf "%c", $i}'
perl -ape '$_=pack("C*",@F)'
从六边形perl
或xxd -p
以上:
xxd -r -p
perl -pe 'chomp;$_=pack("H*",$_)'
答案3
您可以通过操作ibase
和obase
参数来使用 bc 来实现此目的:
诀窍在于你需要明确基础。因此,如果您的 ibase 是 2,那么如果您将 obase 设置为 10,它不会执行任何操作,因为二进制中的 10 是 2。因此您需要使用十六进制表示法。
所以二进制到十进制就是(注意 obase 是 A)
二进制转十进制:
$> echo 'ibase=2;obase=A;11110001011010'|bc
15450
二进制转十六进制:
$> echo 'ibase=2;obase=10000;11110001011010'|bc
3C5A
obase
如果首先更改“输出基础” ,应该会更容易:
$> echo 'obase=10;ibase=2;11110001011010'|bc
15450
$> echo 'obase=16;ibase=2;11110001011010'|bc
3C5A
答案4
对于二进制到十六进制的使用:xxdLinux 中的工具,对于二进制到十进制,您可以使用 qalculate 工具。
xxd --help
有关 xxd 类型或Linux 中的帮助man xxd
。