まとめバイナリファイルの一部を切り出したい時があると思う。今はなくてもいつかはほしいと思うだろう。パケットキャプチャで、httpのトレースをしていたときに途中から生でデータを取ったら、HTTPヘッダ(テキスト)とかついてきて、その後にバイナリになることがある。これをテキストエディタで編集していくと絶対バイナリが壊れる。バイナリとして切り出す必要がある。今回はLinuxのコマンドで簡単にやってみる。バイナリの中身を見てみよう以前このブログでも書いた、ランダムなバイト列のファイルを作る技でバイナリを作った。それで真ん中にテキストを入れて結合してみた。それをhogeというファイルにした。hexdumpでCのオプションをつけると、16進数表記で隣にASCII表示でバイナリの中身が見える。worldがあるのが分かるだろう。これをテキスト部分だけ抜き出してみよう。0x20はスペースなので、helloの前にに2つスペースがある。0x0aはLF改行なので、worldの後にスペース2つの改行があるという感じだ。何バイト目から何バイト目までを切り取るか見てみよう。0x20は00000040と書かれた行の先頭からあるので、0x41バイト目から始まっている。0x10バイトまで書かれているのだ。40と書かれていたら0x41から始まる行である。その行の最後までがテキストなので、0x50バイトまでだ。スペースと改行を含めて考えれば16文字分あった。0x40は10進数にすると64。ファイルの先頭からテキスト部分まで64バイトだ。0x80まであるので、これも数えてみると0x40バイト分あるので、後半も64バイトだ。最初の64バイトが不要で、16バイトが必要で、その後の64バイトが不要ということになる。ddコマンドで切り取りddコマンドを知っているか?LinuxのOSイメージを取ってきたら、USBメモリなどに書き込んだりするときに使うだろう。バイトをそのままあるファイルやデバイスから、別のファイルやデバイスに書き込むコマンドだ。SDカードやUSBメモリなどのバックアップなどにも使っている。これはバイナリを上手く扱えるコマンドという側面がある。ddコマンドは入力ファイルと出力ファイルを取り違えると、ファイル破損してしまうので気をつけること。出来ることならばまずファイルをコピーしてバックアップしておくと良い。count=16ifが読み込むファイル。ofが書き込むファイル。新たに保存されるファイル。これを間違えると元のファイルが無くなってしまう。例では1バイト単位にしている。skipは元ファイルを読み込む際に何ブロックを読み飛ばすかという意味になっている。例では64ブロックを読み飛ばしている。このブロックはbsで指定したバイト数になっている。bsが今回1バイトなので64バイトを先頭から読み飛ばしている。bs=2だったら32と書くことで、64バイトを読み飛ばしてくれる。読み飛ばすとは、つまり元のファイルの65バイト目からコピーを開始するということ。countはコピー開始から何ブロック分コピーをするかという意味でこれもbsで指定したバイト数に依存しているので、例では16バイト分コピーするという意味になっている。bs=2と指定したら、count=8と書くことで、16バイト分切り出すことができる。結果はこのようになった。テキスト部分のみ正しく抜き取れた。16バイト分切り取れていることが確認できる。何バイト目から何バイト分切り出す必要があるのかが確認できれば、あとは簡単に切り取ることができる。古めのシステムで使われている固定長のファイルなどはこの手の計算がしやすい。シェルでループで回せば、他の言語より手軽に分割することができる。哲学科卒業のIT業界の末端にいるお兄さん。好きなディストロはArchLinux。はてなブックマークとtwitterのリンク付きツイートはいつも読んでいます。一言伝えたい場合はTwitterにリプライください。Themehaus当サイトではCookieを利用します。閲覧を続けた場合Cookieの使用に同意したことになります。