我想将十进制格式编号转换为四个八位字节格式编号。例如十进制数字xxxxxxxxxxxxx将转换为四个八位字节编号yy.yy.yy.yyy(如ip地址格式)。如何使用shell脚本转换它。
答案 0 :(得分:1)
好吧,假设你的虚线八位字节格式确实意味着你想要一个32位整数的每个8位部分的十进制数,那么它真的不那么难。只想想一下这个数字的各种表示,即你可以表达相同值的不同基础,以及 octet 究竟是什么,然后考虑如何在shell中进行这样的转换脚本。
首先,您可以将整数从十进制转换为十六进制。
然后将十六进制值拆分为两个字符的组,并将它们中的每一个转换回十进制数。
最后,您将使用连接点组装字符串。
bc
程序在进行基本转换时非常方便,但更简单的可能是printf
命令(甚至可能内置在shell中)。现代shell还支持扩展修饰符%
,%%
,#
和##
,它们允许您表达模式,以便可以以受控方式拆分变量值。 / p>
所以,如果我们把它们放在一起,我们就有了:
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
是内置的)。如果你有一长串要转换的值,AWK可能会更有效率(特别是如果printf
不是内置的话。)
答案 1 :(得分: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
$
我转换为HEX。如果你想转换到其他基地,请告诉我修改电话。