らんだむな記憶

blogというものを体験してみようか!的なー

EBDT(1)


□□□□□□□□
□■■□□■■□
□■■□□■■□
□□□□□□□□
□□■■■■□□
□■□□□□■□
□□■□□■□□
□□□■■□□□

こんな感じのを16進数データ(00666600 3c422418)にしたい:

#! /usr/bin/env python
# -*- coding: utf-8 -*-

import os, sys, re

def split_list(l, n):
    for idx in range(0, len(l), n):
        yield l[idx:idx + n]

def list2hex(l):
    value = 0
    for v in l:
        value = value << 1 | v
    return value

def main():
    units_per_line = -1
    units = 0
    values = []
    with open(sys.argv[1], encoding="utf-8") as f:
        for line in f.readlines():
            line = line.rstrip()
            for c in line:
                if c == "□":
                    values.append(0)
                    units += 1
                elif c == "■":
                    values.append(1)
                    units += 1
                else:
                    raise NotImplementedError()
            if units_per_line < 0:
                units_per_line = units
    for subvalues in split_list(values, 32):
        strfmt = ""
        subvalues_len = len(subvalues)
        if subvalues_len % 8 == 0:
            strfmt = "{{:{:02d}x}}".format(subvalues_len//4)
        else:
            for _ in range((subvalues_len//8+1)*8 - subvalues_len):
                subvalues.append(0)
            strfmt = "{{:{:02d}x}}".format(len(subvalues)//4)
            #raise NotImplementedError()
        print(strfmt.format(list2hex(subvalues)))

if __name__ == "__main__":
    main()