shell脚本中的二进制转十六进制和十进制

shell脚本中的二进制转十六进制和十进制

我有一个上下文,需要在 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 -rperl's pack

od -tu1从以上的十进制输出perl

LC_ALL=C awk '{for (i = 1; i <= NF; i++) printf "%c", $i}'
perl -ape '$_=pack("C*",@F)'

从六边形perlxxd -p以上:

xxd -r -p
perl -pe 'chomp;$_=pack("H*",$_)'

答案3

您可以通过操作ibaseobase参数来使用 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

相关内容