0

我想将十进制格式数字转换为四个八位字节格式数字。例如十进制数字 xxxxxxxxxxxxx 转换为四个八位字节数字 yy.yy.yy.yyy(如 ip 地址格式)。如何使用 shell 脚本进行转换。

4

2 回答 2

1

好吧,假设您的点分八位字节格式确实意味着您想要一个 32 位整数的每个 8 位部分的十进制数,那么这并不难做到。想一想数字的各种表示形式,即可以表达相同值的不同基数,以及八位位组到底是什么,然后考虑如何在 shell 脚本中进行此类转换。

首先,您可以将整数从十进制转换为十六进制。

然后将十六进制值分解为两个字符组,并将它们中的每一个转换回十进制。

最后,您将使用连接点组装您的字符串。

bc程序在进行基本转换时很方便,但更简单的可能是printf命令(甚至可能内置到您的 shell 中)。现代 shell 还支持扩展修饰符%, %%, #, 并##允许您表达模式,以便可以以受控方式拆分变量值。

所以,如果我们把所有这些放在一起,我们就有:

hx=$(printf '%08x\n' $integer)
hx1=${hx#??????}
tm=${hx%??}
hx2=${tm#????}
tm=${tm%??}
hx3=${tm#??}
hx4=${tm%??}
printf '%d.%d.%d.%d\n' 0x$hx4 0x$hx3 0x$hx2 0x$hx1

您可以在 AWK 等中编写大致相同的内容,然后从 shell 中调用它,但我所展示的内容是纯的sh(特别是如果printf是内置的)。如果您有一长串要转换的值(特别是如果不是printf内置的),AWK 可能会更有效。

于 2012-11-23T03:05:36.217 回答
1
$ N=6473673
$ echo "obase=2; $N" | bc | sed ":r /.\{32\}$/ { s:........:&;:g ; /^/ s::ibase=2;obase=10000;:; q } ; /^/ s::0:; tr " | bc | sed 'H ; $ {x;s:\n::; s:\n:.:g;q} ;d'
0.62.C7.C9
$

我转换为十六进制。如果您想转换为其他基础,只需告诉我修改调用即可。

于 2012-11-23T04:45:44.597 回答