Windowsでddコマンドを使ってオール0バイナリを作りたい


アニメ『ハイスクールDxD NEW』
ゴールデンウィークは、ほぼハイスクールDxD三昧です。面白いです。

前回WindowsにインストールしたGNUWinのddコマンドでオール0のバイナリデータを生成しようとしましたが、/dev/zeroがなくて断念しました。
ddで生成するのは諦めた方がよいでしょうか。

では、Windowsでバイナリデータを生成するには。。。

以前「PowerShell(バイナリ書き込み)」で確認したPowerShellのscコマンド(Set-Content)を使って生成してみます。

まずPowerShellを起動

C:\Users\takk\tmp>powershell
Windows PowerShell
Copyright (C) 2014 Microsoft Corporation. All rights reserved.

PS C:\Users\takk\tmp>

sc(Set-Content)で、0 1 2 3 4 5というバイナリファイルa.binを生成します。

PS C:\Users\takk\tmp> ls
PS C:\Users\takk\tmp> [byte[]]$bin=0..5
PS C:\Users\takk\tmp> sc -value $bin -enc byte a.bin
PS C:\Users\takk\tmp>

確認はGNUWin(coreutils)のod使います。

PS C:\Users\takk\tmp> od -tx1 a.bin
0000000 00 01 02 03 04 05
0000006
PS C:\Users\takk\tmp>

PowerShellすごいです。ならPowerShellでいいんじゃないかなと思います。
でも、どうしてもddを使いたい時のため、何か考えてみます。
ddは、コピーするコマンドなので、PowerShellでバイナリを少しだけ生成し、ddでコピー時に保管する機能を使ってよりおおきなバイナリにしてみます。

C:\Users\takk\tmp>dd if=a.bin of=b.bin ibs=10 conv=sync
0+1 records in
0+1 records out
10 bytes (10 B) copied, 0.0009823 seconds, -0.0 kB/s

C:\Users\takk\tmp>

PowerShellで生成した6Byteのa.binをコピー元として、ddコマンドのcnov=syncオプションを使い0値を補完して、10Byteのファイルにしました。
odでも確認してみます。

C:\Users\takk\tmp>od -tx1 -Ax b.bin
000000 00 01 02 03 04 05 00 00 00 00
00000a

C:\Users\takk\tmp>

PowerShellで0値1Byteだけのファイルを作っておき、ddコマンドで伸ばしてみます。

PS C:\Users\takk\tmp> sc -value ([byte]0) -enc byte a.bin
PS C:\Users\takk\tmp> od -tx1 a.bin
0000000 00
0000001
PS C:\Users\takk\tmp> dd if=a.bin of=b.bin ibs=100 conv=sync
0+1 records in
0+1 records out
100 bytes (100 B) copied, 0.0019636 seconds, -5177106467945982400000000000000000
00000000000000000000000 kB/s
PS C:\Users\takk\tmp> od -tx1 -Ax b.bin
000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
*
000060 00 00 00 00
000064
PS C:\Users\takk\tmp>

できるデータが単純な割に、コマンド入力が多いので実用的じゃないですが、頭の体操として使っていこうと思います。

ちなみにtouchで空ファイルを生成して、ddコマンドのconv=syncで補完はできるのでしょうか。

C:\Users\takk\tmp>rm a.bin

C:\Users\takk\tmp>
C:\Users\takk\tmp>touch a.bin

C:\Users\takk\tmp>od -tx1 a.bin
0000000

C:\Users\takk\tmp>wc -c a.bin
0 a.bin

C:\Users\takk\tmp>dd if=a.bin of=b.bin ibs=100 conv=sync
0+0 records in
0+0 records out
0 bytes (0 B) copied, 0 seconds, Infinity B/s

C:\Users\takk\tmp>

データが何もないと、補完もされないようです。

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA