例:
$ 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
。
メインスタックの上部に2を追加します。
メインスタックで最上位の値をポップし、その値を
o
出力ベースとして使用します。65 追加(AのASCII 10進値が私のロケールに変換されます
printf
)メインスタックのトップへデフォルトのスタックで最上位の値をポップし、
p
その値をstdout
現在の出力ベースとして指定されたベースに印刷します。
dc
また、入力ベースで解釈されたバイトのASCII値を印刷します。
printf 8i%oP "'A" | dc
A
...そして...
printf 2i%sP 1000001 | dc
A
i
この手順は、入力ベースが指定されi
(以前のo
出力ベースではなく)、P
最上位スタック値が出力のASCII文字として解釈されることを除いて、前の手順と非常によく似ています。
bc
構文がより冗長になる傾向がありますが、同じことをたくさん行うことができます。man dc
より多くのことをするman bc
。ただし、ビットシフトはこれら2つのプログラムの機能ではありません。ただし、前述のように、すべてのPOSIXシェルは算術拡張を使用して非常に簡単に処理できます。