bashで符号なし10進数(1 <<32未満)を4バイト(2進数)に変換するには?

bashで符号なし10進数(1 <<32未満)を4バイト(2進数)に変換するには?

例:

$ decimal=$(( RANDOM << 17 | RANDOM << 2 | RANDOM >> 13 ))
$ echo $decimal
$ printf "%08x" $decimal | xxd -r -p >bytes

結果はbytesファイルにあります。

まず、16進数に不必要に変換せずに単一のコマンドで実行できますか?

答え1

printf組み込み関数を使用して、8進コードで提供されたバイトをエクスポートできます。

x=1193046
printf "$(printf "\\%03o" $((x>>24&255)) $((x>>16&255)) $((x>>8&255)) $((x&255)))"

答え2

あなたはそれを使用することができますperl

$ perl -e 'print pack "I>", shift' $(( RANDOM << 17 | RANDOM << 2 | RANDOM >> 13 ))

答え3

dc同様に、任意の出力ベースから任意の入力ベースと出力を取ることができます。dcまず、値を渡して通信します。(またはスペースで区切られた値の文字列)以下は、値を処理するコマンドです。dc入力と出力の両方がデフォルトで10進数です。

たとえば、10進値を2進数に変換します。(または少なくとも基本2):

printf 2o%dp "'A" | dc
1000001

これは次のコマンドリストと同じですdc

  1. メインスタックの上部に2を追加します。

  2. メインスタックで最上位の値をポップし、その値をo出力ベースとして使用します。

  3. 65 追加(AのASCII 10進値が私のロケールに変換されますprintfメインスタックのトップへ

  4. デフォルトのスタックで最上位の値をポップし、pその値をstdout現在の出力ベースとして指定されたベースに印刷します。

dcまた、入力ベースで解釈されたバイトのASCII値を印刷します。

printf 8i%oP "'A" | dc
A

...そして...

printf 2i%sP 1000001 | dc
A

iこの手順は、入力ベースが指定されi(以前のo出力ベースではなく)、P最上位スタック値が出力のASC​​II文字として解釈されることを除いて、前の手順と非常によく似ています。

bc構文がより冗長になる傾向がありますが、同じことをたくさん行うことができます。man dcより多くのことをするman bc。ただし、ビットシフトはこれら2つのプログラムの機能ではありません。ただし、前述のように、すべてのPOSIXシェルは算術拡張を使用して非常に簡単に処理できます。

関連情報