情報理工学系研究科の入試案内ポスターにまつわる話 (2)
去年情報理工学系研究科の入試案内ポスターに印字された0と1の羅列をビット列と見なして内容を解読するお祭りが開かれましたが、今年も新しいポスターがお目見えして同様のお祭りが開かれました。時系列でざっとまとめると…
- 今回は、まず @plus7 氏と @Mekajiki 氏が書き起こしを行い、Google Spreadsheetにまとめました。
- 次に、@h013 氏を含む数名が先頭の配列からgzipっぽいという推察を行いました。
- 実際にこれをgzip書庫と見なして解凍したところ先頭に0xCAFEBABEの署名がある、mainメソッドを含むJavaのクラスファイルが出てきました。
- そこで、クラス名であるiにあわせてファイル名をi.classにしたうえでjava iしたら、とあるURLが出てきました。
- URLからはMP3ファイルがダウンロードできます。途中ノイズに聴こえる部分を逆再生すると意味のある言葉になります。
関係諸氏のみなさまお疲れさまでした。より詳細な状況が分かるTwitterタイムラインのまとめもどうぞ。解けるまではやかったなー…
URLへのリンクは後日追加するかもしれません。せっかくなので自分で解いてみてね!(コードが書けないけど気になる人は、Twitterで #istposter を見ると分かっちゃうかも。)
どうということはないのですが01の羅列からなるテキストをバイナリデータに変換するコードを置いておきます。 test.src にテキストを書き込んでおくと test.gz にgunzip可能なバイナリが出力されます。
けっこう長いですね。Perlを使ったワンライナー(1)(2)のほうが簡単です。ワンライナーかっこいい。あとPythonも短い。
package istposter2; import java.io.BufferedReader; import java.io.FileOutputStream; import java.io.FileReader; public class StrToBin { public static void main(String[] args) { try { BufferedReader br = new BufferedReader(new FileReader("test.src")); FileOutputStream fos = new FileOutputStream("test.gz"); String line; int b = 0; int bi = 0; int length = 0; while ((line = br.readLine()) != null) { for (int i = 0; i < line.length(); i ++) { b |= (line.charAt(i) == '1' ? 1 : 0) << (7 - (bi ++)); if (bi == 8) { fos.write(b); b = bi = 0; } length ++; } } if (bi != 0) { fos.write(b); } br.close(); fos.close(); System.out.println("Length: " + length + " bits"); } catch (Exception e) { e.printStackTrace(); } } }