Hendrik van Rooyen <[EMAIL PROTECTED]> wrote:
>Is there a canonical way to address the bits in a structure
>like an array or string or struct?
>
>Or alternatively, is there a good way to combine eight
>ints that represent bits into one of the bytes in some
>array or string or whatever?

This is the code I use to convert large bit arrays to byte strings and
back:

import string
import binascii
import array

_tr_16 = string.maketrans("0123456789abcdef",
                          "\x00\x01\x02\x03"
                          "\x10\x11\x12\x13"
                          "\x20\x21\x22\x23"
                          "\x30\x31\x32\x33")
_tr_4 = string.maketrans("0123",
                         "\x00\x01"
                         "\x10\x11")
_tr_2 = string.maketrans("01", "\x00\x01")

def string_to_bit_array(s):
        """Convert a string to an array containing a sequence of bits."""
        s = binascii.hexlify(s).translate(_tr_16)
        s = binascii.hexlify(s).translate(_tr_4)
        s = binascii.hexlify(s).translate(_tr_2)
        a = array.array('B', s)
        return a

_tr_rev_2 = string.maketrans("\x00\x01", "01")
_tr_rev_4 = string.maketrans("\x00\x01"
                             "\x10\x11",
                             "0123")
_tr_rev_16 = string.maketrans("\x00\x01\x02\x03"
                              "\x10\x11\x12\x13"
                              "\x20\x21\x22\x23"
                              "\x30\x31\x32\x33",
                              "0123456789abcdef")
def bit_array_to_string(a):
        """Convert an array containing a sequence of bits to a string."""
        remainder = len(a) % 8
        if remainder != 0:
                a.fromlist([0] * (8 - remainder))
        s = a.tostring()
        s = binascii.unhexlify(s.translate(_tr_rev_2))
        s = binascii.unhexlify(s.translate(_tr_rev_4))  
        return binascii.unhexlify(s.translate(_tr_rev_16))

I don't think you can do anything faster with standard modules, although
it might not be effecient if you're only working with a single byte.

                                Ross Ridge

-- 
 l/  //   Ross Ridge -- The Great HTMU
[oo][oo]  [EMAIL PROTECTED]
-()-/()/  http://www.csclub.uwaterloo.ca/~rridge/ 
 db  //   
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to