Data reading problem

Fredrik Lundh fredrik at pythonware.com
Sun Dec 19 17:00:14 CET 2004


Michal Szpadzik wrote:

> I have some problems with bits data reading. I have binary data file where data is written as 
> 12bits pack. I need to read it becouse there are saved values which have to processed later by my 
> program. I was wandering about reading 3bytes=24bits and split it by bits moving. If anyone know 
> how to do that please tell me or give me some code.
>
> My data example:
> 101001000101111010100101 etc
>
> i need to split it:
> x=101001000101   y=111010100101

assuming MSB first,

    a = ord(fp.read(1))
    b = ord(fp.read(1))
    c = ord(fp.read(1))

    x = (a << 4) + (b >> 4)
    y = ((b & 15) << 8) + c

should do the trick

if you need to read lots of 12-bit values, you can create a simple bitstream
generator:

    def bitstream(file, size=12):
        bitbuffer = bits = 0
        while 1:
            char = file.read(1)
            if not char:
                raise StopIteration
            bitbuffer = (bitbuffer << 8) | ord(char)
            bits = bits + 8
            while bits >= size:
                yield (bitbuffer >> (bits - size)) & ((1 << size) - 1)
                bits = bits - size

for example:

    file = open("file.dat", "rb")

    for word in bitstream(file):
        print hex(word)

prints

    0xa45
    0xea5

</F> 






More information about the Python-list mailing list