【Py2.5】文字列をビット単位で調べる

[pukiwiki]

急に、Flash(SWF)のヘッダを調べたくなったのだけれど、バイナリエディタだけだと大変なので、ビット単位で調べるための関数を書いてみました

で、そもそも、何で今更FlashをPythonでいじろうと思ったかといいますと。。。
*[[【動画】世界初 3Dデジカメ:http://www.tv-tokyo.co.jp/emorning/contents/2009-04/03/028652.html]]
こちらの立体カメラの静止画、左右2枚を ”「マウスドラッグすると微妙に向きが変わって見えるFlash」”に変換したいな、と。
(できれば、左右の画像の中割も行いたい)
[/pukiwiki]


—-
どこかで作ってた人が居たはずなのですが、ちょっと判らなかったので、自分で作ることに

ここまでで気力が尽きたので、SWFの調査はまた今度(汗

# -*- coding: utf-8 -*-
"bit.py"
def bitreader(s):
    u"""文字列をビット単位で調べるためのジェネレータ"""
    for i in s :
        i=ord(i)
        for j in xrange(8):
            
            ret= 1 if ( i & 0x80) else 0
            i<<=1
            yield ret
def bit2str(blist):
    bit_length=len(blist)
    #print "bit_length",bit_length
    byte_length=bit_length//8
    #print "byte_length",byte_length
    ret=[]
    i=0
    for i in xrange(0,byte_length*8,8):
        
        ret.append( chr(bit2int(blist[i:i+8]))) 
    if bit_length%8 :

        remain=blist[i+8:]
        #print "len(remain)",len(remain)
        remain+=[0 for x in xrange(8-len(remain))]
        #print "len(remain)",len(remain)
        ret.append( chr(bit2int(remain)))
    
    ret="".join(ret)
    return ret
        

def bit2int(blist,endian="big"):
    u"""  bit2int([0,0,0,0, 0,0,0,0,1])  -> 1
     bit2int([0,0,0,0, 0,0,0,0,1],endian="little")  -> 256
    """
    ret=0
    blist1=list(blist[:])
    if endian=="big":
        blist2=blist1[:]
    else:
        blist2=[]
        for i in xrange(0,len(blist1),8):
            blist2=blist1[i:i+8]+blist2

    for b in blist2:
        ret<<=1
        ret+=b

    return ret


from math import log 
def int2bit(i):
    u"""int2bit(32) -> [1, 0, 0, 0, 0, 0]
     i>0
    """
    ret=[]
    if not i :return [0,]
    
    for j in xrange( log(i) /log(2)+1):
        ret.append(1 if i& 0x01  else 0)
        i>>=1
    ret.reverse()       
    return ret

def str2int(s,endian="big"):
    "str2int("\x03\x02\x01")  ->  0x010203 big endian"
    t=0

    if endian=="big":
        s=reversed(s)
    for i in s:
        t<<=8
        t+=ord(i)
    return t



if __name__=="__main__":
#ひととおり テスト
    s="".join([chr(x) for x in range(255)])
    bits=[x for x in bitreader(s)]
    bits.append(1)
    s+="\x80"
    s2=bit2str(bits)
    
    if s!=s2 :
        print """
        bits=[x for x in bitreader(s)]
        s2=bit2str(bits]
        """
        raise Exception

    s2=[]
    for c in s :
        c2=chr(bit2int([x for x in bitreader(c)]))
        if c2!=c :
            print  "%s"%  ord(c)
            raise Exception
        s2.append(c2)
    s2="".join(s2)
    if s2!=s :
        print "s2!=s"
        raise Exception
    blist=[x for x in bitreader(s)]
    s3=[]
    b2=range(8)
    
    for i,b in enumerate(blist):
        m=i%8
        b2[m]=b
        if m==7 :
            s3.append(chr(bit2int(b2)))
    s3="".join(s3)
    if s3!=s :
        print "s3!=s"
        raise Exception
        
    if True :
     for i in xrange(65536,65536*256,65535):
        if (bit2int(int2bit(i)))!=i:
            print  i
            raise Exception

    print "OK"
    

[pukiwiki]

*その他 関連3Dデジカメ関連
[[裸眼で立体映像を楽しむことが可能な世界初の立体3Dデジタルカメラ「FinePix Real3D」の実機を触ってきました:http://gigazine.net/index.php?/news/comments/20090326_fuji_real3dsystem/]]
—-
-[[『クラシック立体写真(ステレオカメラとステレオビュアー)の秘蔵展』:http://fujifilmsquare.jp/detail/08032802.html]]
-[[ステレオカメラ(ウィキペディア):http://ja.wikipedia.org/wiki/%E3%82%B9%E3%83%86%E3%83%AC%E3%82%AA%E3%82%AB%E3%83%A1%E3%83%A9]]
-[[私が所有しているステレオカメラの色々について(Yossy’s World):http://ww2.tiki.ne.jp/~yossy/main1.html]]

こういうレトロなデザインを期待してたので、ちょっと違ったかなー

ただ、こういうキワモノは、売ってるときに買わないと、次はいつ製品化されるか判らないので、一応、定額給付金を貯金しておくことに(をぃ
でも、定額給付金に、どれぐらい足せば買えるのかしらん?あまり高いと買えない。。。

*写真の寿命はOSよりも長い
“ちなみに、3Dデジタルカメラで記録された3D映像のファイルは独自形式となる。
[[ITmedia:http://plusd.itmedia.co.jp/lifestyle/articles/0809/24/news100.html]]

それは激しく抗議したいかも
JPEG2枚使って、関連付けデータはコメントとして記録すれば十分なのではないかしらん?
将来、OSが変わって、ドライバなどのソフトが使えなくなって、写真データが扱えなくなったら困っちゃいますし。

HDRイメージに変換できるRAWフォーマットなどが使えるなら、それはそれでうれしいですが。

[/pukiwiki]

コメントを残す

メールアドレスが公開されることはありません。