
/dev/urandom
次に、埋め込まれたファイルから10 MBのファイルを生成する方法:
ASCII 1と0
0から9までのASCII番号
答え1
0から9までのASCII番号
< /dev/urandom tr -dc '[:digit:]' | head -c 10000000 > 10mb.txt
ASCII 1と0
< /dev/urandom tr -dc 01 | head -c 10000000 > 10mb.txt
答え2
受信された各バイトの実際の値は、PRNGによって決定されるとおり、そのバイト値が正常に発生する可能性を示す限りで意味があると考えると、</dev/urandom
入力バイトが探しているバイトの近くにないことに気づくでしょう。重要どのくらいの頻度もちろん。 PRNGが十分であれば、読み取るすべてのバイトについて、ASCIIスペクトルにどのバイトが表示される確率は1/256でなければなりません。
スコープをASCIIサブセットに絞り込む場合、問題を処理する最も効率的な方法は、サブセット内のその文字の発生を同時に拡張し、他の文字が発生する可能性を排除することです。tr
指定された範囲の文字を複数の代替文字に変換できるため、この機能は非常に優れています。このように:
d=$(printf '[%d*25]' 1 2 3 4 5 6 7 8 9)
</dev/urandom LC_ALL=C tr '\0-\377' "$d[0*]"
そこにはいくつかのことが進んでいます。
d=[[char]*[num]]...
tr
ここでは、次の行を送信する2番目のパラメータを含むvarを設定しました。[]
角かっこ内の各値は変換対象でありtr
、各*25
値は最初の引数で指定された順序で範囲のメンバーのうち何個をtr
その文字に変換する必要があるかを示します。
LC_ALL=C
- これ(重要)規制すべて読み取ったバイトはASCIIバイトとして解釈する必要があるためみんな読み取られるバイトは NUL から 8 進数までです
\377
。
- これ(重要)規制すべて読み取ったバイトはASCIIバイトとして解釈する必要があるためみんな読み取られるバイトは NUL から 8 進数までです
'\0-\377' "$d[0*]"
- これは、
tr
の値に基づいてすべての入力バイトを変換するように指示します$d
。これはバイトを意味します。\0-\30
(または範囲の最初の25バイト)\31-\61
1、2などに変換されます。
- これは、
その結果、すべての入力は数値にのみ変換されます。(ほぼ)ランダム性均一分布 - などすべてバイトが使用されますが、最終的にすべてが欲しいものです。ただし、上記の例では、0はtr
他のバイトよりも出力に表示される可能性が4%高くなります。これが問題の場合は、次のこともできます。
LC_ALL=C </dev/urandom \
tr '\0-\377' "[\0*5]$d[0*]" |
tr -d \\0
...この問題は解決しました。
これで10Mの場合は、次のように動作します。
TR PIPELINE | dd bs=4k count=2560