[Tutor] Bit-level field extraction
Alan Gauld
alan.gauld at freenet.co.uk
Tue May 16 17:01:23 CEST 2006
Terry,
Your approach is fine. Personally however I'd just have defined
some constants and done a direct bitwise and - this is the
approach used in the stat module:
VMASK = 0x14 # 00011000
VER00 = 0x00
VER01 = 0x04
VER10 = 0x10
VER11 = 0x14
version = byte & VMASK
if version == VER00: #do something
elif version == VER01: # do another
etc...
But I'm just an old assembler programmer in disguise :-)
A function approach is OK too...
Alan Gauld
Author of the Learn to Program web site
http://www.freenetpages.co.uk/hp/alan.gauld
----- Original Message -----
From: "Terry Carroll" <carroll at tjc.com>
To: <tutor at python.org>
Sent: Tuesday, May 16, 2006 6:25 AM
Subject: [Tutor] Bit-level field extraction
>I want to see if I'm reinventing a wheel here, or maybe doing it
> unpythonically.
>
> I need to extract from a byte (i.e., a one-character string) a field
> of an
> certain number of bits. For example, a certain byte of an MP3 frame
> header has the format xxxVVxxx, where the value of VV (00, 01, 10 or
> 11)
> tels what version of MPEG Audio is being used. The other bits
> marked 'x'
> are not relevant to the version id, and may be 1s or 0s.
>
> Here's my stab:
>
> def getbits(byte, fieldlength, rightpad):
> '''
> returns an integer with the value derived from a string of bits
> of
> length fieldlength, right-padded with rightpad number of bits.
> e.g., getbyte(byte, 2, 3) returns a value from bits 3-4
> (counting from the right)
> '''
> bitmask = (2**fieldlength-1) << rightpad
> return (ord(byte) & bitmask) >> rightpad
>
> testbytes = ["\xC0", "\x08", "\xF0", "\x19"]
> for byte in testbytes:
> print getbits(byte, 2, 3)
> # should get 0, 1, 2, 3
>
>
> This works (at least for these 4 test cases). But is this the best
> way to
> extract a bit-level field, or am I missing some appropriate module
> or
> something?
>
>
>
More information about the Tutor
mailing list