オール0ファイル

アニメは休息中。代りにゲーム三昧です。ブログタイトルを「ゲームの達人」に変えようかな、なんて思っておりますが、カセットテープ版の「家出のドリッピー」でお世話になったシドニー・シェルダン先生の小説とかぶるので、やめておきます。面白いですゲーム。毎日がゲーム中心で回ってます。まあ、あまりゲームにのめり込むとゲームやるために会社休みそうな勢いですので、ゲームは一日8時間までと規制してます。

さて、デバッグ用のバイナリデータを作成するとき、コマンドラインが重宝しますが、一番よく使う値は、オール0やオール0xFFといった値のバイナリデータ。
xxdで魔法のようにバイナリを生成する」でもやりましたが、方法は無限にありそうです。
今回は、前回使ったtruncateも含めて、バイナリデータ生成のコマンドの使いやすさを比較してみます。

まずはサイズを計算。100MByteのファイルを作りたいので1Byteで何Byteになるか換算します。計算機としてよく使うirb。

takk@deb9:~/tmp$ irb
irb(main):001:0> 1024**2*100
=> 104857600
irb(main):002:0> quit
takk@deb9:~/tmp$ 

では、perlで生成。

takk@deb9:~/tmp$ time perl -e 'foreach(1..104857600){print chr 0}' > c.bin

real	0m14.485s
user	0m4.752s
sys	0m0.048s
takk@deb9:~/tmp$ 

標準入出力使うからか、すごく遅い。
次は標準的な方法、dd。

takk@deb9:~/tmp$ dd if=/dev/zero of=b.bin bs=1024 count=102400
102400+0 レコード入力
102400+0 レコード出力
104857600 bytes (105 MB, 100 MiB) copied, 0.364127 s, 288 MB/s
takk@deb9:~/tmp$ 

先ほどが遅すぎたので、速い! って思いましたが、こんなもんでしょう。
ddの難点は、入力が長いところ。すぐ作りたいときに面倒です。
次は、truncate。

takk@deb9:~/tmp$ time truncate -s 104857600 c.bin

real	0m0.002s
user	0m0.000s
sys	0m0.000s
takk@deb9:~/tmp$ 

意外に速い。何より覚えやすい。

しかも、単位が指定できるので、使わない手はありません。

takk@deb9:~/tmp$ time truncate -s 100m d.bin

real	0m0.002s
user	0m0.000s
sys	0m0.000s
takk@deb9:~/tmp$ 

サイズもこのとおり正確です。当たり前ですが。

takk@deb9:~/tmp$ wc -c d.bin
104857600 d.bin
takk@deb9:~/tmp$ 

各コマンドで生成されたバイナリデータは当然一致します。

takk@deb9:~/tmp$ cmp a.bin b.bin
takk@deb9:~/tmp$ cmp b.bin c.bin
takk@deb9:~/tmp$ cmp c.bin d.bin
takk@deb9:~/tmp$ 

もちろん内容はオール0です。

takk@deb9:~/tmp$ od -tx1 -Ad a.bin
0000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
*
104857600
takk@deb9:~/tmp$

コメント

タイトルとURLをコピーしました