Ansatzの備忘録

勉強したことあるいはふと思い立ったこと

シェルワンライナー160本ノック問題88

問題88 電子透かしの解読

問題のファイルは

https://github.com/shellgei/shellgei160

からダウンロードできる。

ヒントをもらいはしたがやっぱり全然できなかった。だが結構面白い話題だなと思った。Bの末尾に情報が埋め込まれているのを抜き出す問題だった。

解答例は

cat image_masked.bmp | xxd -b -c1 | sed -n '139,$p' | sed -n '1~3p' | awk '{print $2}' | cut -c 8 | tr -d '\n' | perl -nle 'print pack("B*",$_)'

となる。

前提として、画像の色は1色3バイトであらわされる。RGBでそれぞれ1バイトずつ使う。それを踏まえてまず画像を1行1オクテットで2進数で表示する。そのあと画像のデータが139番目以降なのでそこだけ抜き出す。画像の色はBGRの順でデータが上から並んでいるので3行ごとに抜き出してBだけ残す。そのあとオフセットをawkで除去して末尾の桁だけをcutでとり、改行を除去してperlで処理すると解答が得られる。

bmpの仕様を正しく把握するのが一番大事だった。これを把握できなくていまいちな考えにとらわれていた。

Windows bitmap - Wikipedia