Writing bitfields with varying field lengths
Mike C. Fletcher
mcfletch at rogers.com
Mon Aug 18 21:16:02 EDT 2003
Grumfish wrote:
> In order to familiarize my self with Flash files and their bytecode
> I've started to make an assembler. My first problem is writing the
> bitfields the format uses often. It is a series of fields, each can be
> a different number of bits, combined into the least amount of bytes
> possible. Extra bits in the last byte are padded with zeros. I would
> like to make a function that takes a size and value for each field
> needed, calculate the amount of needed bytes, place the values, and
> the nretun a binary string of the resulting bitfield. I am at a
> complete loss on how to place the values into the field. I've Googled
> but have found nothing helpful. Can anybody help?
This should help you get started. There are more efficient ways to do
the work, but this is easily followed (hopefully):
def packBitField( * items ):
"""Pack any size set of boolean values into binary string"""
result = []
items = list(items)
while len(items)>=8:
result.append( pack8( items[:8] ) )
del items[:8]
if items:
result.append( pack8( items+([0]*(8-len(items)) ) ))
return "".join( result )
def pack8( items ):
"""Pack 8 booleans into a byte"""
value = 0
for x in range(len(items)):
value += (not not items[x])<<x
return chr(value)
if __name__ == "__main__":
print repr(packBitField( 0 ))
print repr(packBitField( 1 ))
print repr(packBitField( 0,1 ))
print repr(packBitField( 1,1 ))
print repr(packBitField( 0,0,1 ))
print repr(packBitField( 1,0,1 ))
print repr(packBitField( 0,1,1 ))
print repr(packBitField( 1,1,1 ))
print repr(packBitField( 0,0,0,0,0,0,0,0,1 ))
Enjoy,
Mike
_______________________________________
Mike C. Fletcher
Designer, VR Plumber, Coder
http://members.rogers.com/mcfletch/
More information about the Python-list
mailing list