arc の日記

はてなダイアリーから引っ越してきました。さらに新しい記事は https://junkato.jp/ja/blog/ で書いています。

情報理工学系研究科の入試案内ポスターにまつわる話 (2)

去年情報理工学系研究科の入試案内ポスターに印字された0と1の羅列をビット列と見なして内容を解読するお祭りが開かれましたが、今年も新しいポスターがお目見えして同様のお祭りが開かれました。時系列でざっとまとめると…

関係諸氏のみなさまお疲れさまでした。より詳細な状況が分かる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();
		}
	}

}