0

10 進数形式の数値を 4 オクテット形式の数値に変換したいです。たとえば、10 進数の xxxxxxxxxxxxx は 4 オクテットの数値 yy.yy.yy.yyy に変換されます (IP アドレス形式のように)。これをシェル スクリプトを使用して変換する方法。

4

2 に答える 2

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に変換しました。他のベースに変換したい場合は、呼び出しを変更するように言ってください。

于 2012-11-23T04:45:44.597 に答える
1

さて、ドット付きオクテット形式が、たとえば 32 ビット整数の各 8 ビット部分に 10 進数が必要であることを本当に意味すると仮定すると、実際にはそれほど難しいことではありません。数値のさまざまな表現、つまり、同じ値を表現できるさまざまな基数と、正確にはオクテットとは何かについて少し考えてから、シェル スクリプトでそのような変換を行う方法について考えてみてください。

まず、整数を 10 進数から 16 進数に変換できます。

次に、16 進数値を 2 文字のグループに分割し、それぞれを 10 進数に変換します。

最後に、接続ドットを使用してストリングを組み立てます。

bcプログラムは基本変換を行うのに便利ですが、コマンドの方が簡単かもしれません(printfシェルに組み込まれている場合もあります)。最新のシェルは、拡張修飾子%%%#、およびもサポートし##ています。これにより、制御された方法で変数値を分割できるようにパターンを表現できます。

したがって、これらをすべてまとめると、次のようになります。

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 などでほぼ同じものを記述して、シェルから呼び出すこともできますが、私が示したのは純粋なものですsh(特にprintfが組み込まれている場合)。printf変換する値のリストが長い場合 (特にが組み込まれていない場合) 、AWK の方が効率的です。

于 2012-11-23T03:05:36.217 に答える