概要
小ネタ。よく忘れるのでメモメモ。
開発時に特定のバイナリファイルを扱うようなときがあって、たまに中身がオールゼロ(\0, NULL文字) のデータがほしいときがたまーにあります。
そういうときに、大抵は dd
コマンドを使って作ったりすることが多いと思いますが、dd
コマンドって注意して使わないと、とんでもないサイズのファイルを作ったりするので、あまり好きではないです。。w (bsの指定忘れたりすると、全部食い尽くすファイルが生成されたり)
お手軽に作れる方法があって、head
コマンドと /dev/zero
が使えます。こんな感じ。
$ head -c 100 /dev/zero > zero.bin
これで、サイズが 100バイト で中身がオールゼロのデータになります。
dd
コマンドだと以下のようになりますね。
$ dd if=/dev/zero of=zero.bin bs=100 count=1 2>/dev/null
サンプル
以下、head
コマンドを利用したサンプルです。
#!/usr/bin/env bash basedirpath=/tmp/try-linux/zerobinary rm -rf "${basedirpath}" mkdir -p "${basedirpath}" ## 指定したサイズで中身が \0 のデータのファイルを作る # head -c 1024 /dev/zero > "${basedirpath}/zero.bin" # 確認 echo '----------------------------------------------' ls -l "${basedirpath}/zero.bin" hexdump "${basedirpath}/zero.bin" ## 中身を \1 のデータのファイルを作る # head -c 1024 /dev/zero | tr '\0' '\1' > "${basedirpath}/one.bin" # 確認 echo '----------------------------------------------' ls -l "${basedirpath}/one.bin" hexdump "${basedirpath}/one.bin"
実行すると以下のようになります。
gitpod /workspace/try-linux $ make ENTER EXAMPLE NAME: zerobinary_head [INPUT ] zerobinary_head [TARGET] zerobinary_head [SCRIPT] basic/zerobinary/zerobinary_head.sh ===== START [basic/zerobinary/zerobinary_head.sh] ===== ---------------------------------------------- -rw-r--r-- 1 gitpod gitpod 1024 Jan 15 15:43 /tmp/try-linux/zerobinary/zero.bin 0000000 0000 0000 0000 0000 0000 0000 0000 0000 * 0000400 ---------------------------------------------- -rw-r--r-- 1 gitpod gitpod 1024 Jan 15 15:43 /tmp/try-linux/zerobinary/one.bin 0000000 0101 0101 0101 0101 0101 0101 0101 0101 * 0000400 ===== END [basic/zerobinary/zerobinary_head.sh] =====
以下、dd
コマンドを使用したサンプルです。
#!/usr/bin/env bash basedirpath=/tmp/try-linux/zerobinary rm -rf "${basedirpath}" mkdir -p "${basedirpath}" ## 指定したサイズで中身が \0 のデータのファイルを作る # dd if=/dev/zero of="${basedirpath}/zero.bin" bs=1024 count=1 2>/dev/null # 確認 echo '----------------------------------------------' ls -l "${basedirpath}/zero.bin" hexdump "${basedirpath}/zero.bin" ## 中身を \1 のデータのファイルを作る # tmpfile=$(mktemp) dd if=/dev/zero of="${tmpfile}" bs=1024 count=1 2>/dev/null tr '\0' '\1' < "${tmpfile}" > "${basedirpath}/one.bin" # 確認 echo '----------------------------------------------' ls -l "${basedirpath}/one.bin" hexdump "${basedirpath}/one.bin"
gitpod /workspace/try-linux $ make ENTER EXAMPLE NAME: zerobinary_dd [INPUT ] zerobinary_dd [TARGET] zerobinary_dd [SCRIPT] basic/zerobinary/zerobinary_dd.sh ===== START [basic/zerobinary/zerobinary_dd.sh] ===== ---------------------------------------------- -rw-r--r-- 1 gitpod gitpod 1024 Jan 15 15:45 /tmp/try-linux/zerobinary/zero.bin 0000000 0000 0000 0000 0000 0000 0000 0000 0000 * 0000400 ---------------------------------------------- -rw-r--r-- 1 gitpod gitpod 1024 Jan 15 15:45 /tmp/try-linux/zerobinary/one.bin 0000000 0101 0101 0101 0101 0101 0101 0101 0101 * 0000400 ===== END [basic/zerobinary/zerobinary_dd.sh] =====
過去の記事については、以下のページからご参照下さい。
- いろいろ備忘録日記まとめ
サンプルコードは、以下の場所で公開しています。
- いろいろ備忘録日記サンプルソース置き場