シェルワンライナー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の仕様を正しく把握するのが一番大事だった。これを把握できなくていまいちな考えにとらわれていた。