Differences between revisions 11 and 12
Revision 11 as of 2008-05-01 21:17:18
Size: 4443
Editor: 70-88-243-108-ma-nh-me-ne
Comment:
Revision 12 as of 2008-11-15 14:00:57
Size: 4455
Editor: localhost
Comment: converted to 1.6 markup
Deletions are marked like this. Additions are marked like this.
Line 13: Line 13:
The closest thing I've found is [http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/113799 ASPN: bit-field manipulation.] The closest thing I've found is [[http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/113799|ASPN: bit-field manipulation.]]
Line 171: Line 171:
 * [http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/113799 ASPN: bit-field manipulation]  * [[http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/113799|ASPN: bit-field manipulation]]
Line 174: Line 174:
 * [http://www.python.org/doc/current/lib/module-array.html array module] -- (issued with Python)
 * [http://www.python.org/doc/current/lib/module-struct.html struct module] -- (issued with Python)
 * [http://www.python.org/doc/current/lib/module-binascii.html binascii module] -- (issued with Python)
 * [http://pyserial.sourceforge.net/ pySerial module] -- access the serial port
 * [[http://www.python.org/doc/current/lib/module-array.html|array module]] -- (issued with Python)
 * [[http://www.python.org/doc/current/lib/module-struct.html|struct module]] -- (issued with Python)
 * [[http://www.python.org/doc/current/lib/module-binascii.html|binascii module]] -- (issued with Python)
 * [[http://pyserial.sourceforge.net/|pySerial module]] -- access the serial port

I'm looking for information on Python bit manipulation, binary manipulation.

It seems that there are no modules for performing Python bit manipulation.

I personally want to be able to:

  • Turn "11011000111101..." into bytes, (padded left or right, 0 or 1,) and vice versa.
  • Slice ranges of bits
  • Rotate bits, addressed by the bit. That is, say: "rotate bits 13-17, wrapping around the edges," or, "rotate bits 13-17, lose bits on the one side, set all new bits to 0."
  • Similarly, revert regions of bits, apply logic to regions of bits, etc.,.
  • Switch Endianness, with different block sizes.
  • Apply operations in block groupings: ex: apply XOR 10101 (5 bits) repeatedly across a field.

The closest thing I've found is ASPN: bit-field manipulation.

I imagine that there are many more manipulations people would like to do with bits.

Manipulations

To integer.

   1 >>> print int('00100001', 2)
   2 33

To hex string. Note that you don't need to use x8 bits.

   1 >>> print "0x%x" % int('11111111', 2)
   2 0xff
   3 >>> print "0x%x" % int('0110110110', 2)
   4 0x1b6
   5 >>> print "0x%x" % int('0010101110101100111010101101010111110101010101', 2)
   6 0xaeb3ab57d55

To character. 8 bits max.

   1 >>> chr(int('111011', 2))
   2 ';'
   3 >>> chr(int('1110110', 2))
   4 'v'
   5 >>> chr(int('11101101', 2))
   6 '\xed'

Characters to integers, but not to strings of 1's and 0's.

   1 >>> int('01110101', 2)
   2 117
   3 >>> chr(int('01110101', 2))
   4 'u'
   5 >>> ord('u')
   6 117

Individual bits.

   1 >>> 1 << 0
   2 1
   3 >>> 1 << 1
   4 2
   5 >>> 1 << 2
   6 4
   7 >>> 1 << 3
   8 8
   9 >>> 1 << 4
  10 16
  11 >>> 1 << 5
  12 32
  13 >>> 1 << 6
  14 64
  15 >>> 1 << 7
  16 128

Transformations Summary

Strings to Integers:

  • "1011101101": int(str, 2)

  • "m": ord(str)

  • "0xdecafbad": int(str, 16) (known to work in Python 2.4)

  • "decafbad": int(str, 16) (known to work in Python 2.4)

Integers to Strings:

  • "1011101101": no built-in technique (see below)

  • "m": chr(str)

  • "0xdecafbad": hex(val)

  • "decafbad": "%x" % val

We are still left without a technique for producing binary strings, and decyphering hex strings.

Hex String to Integer

The simplest approach is to use the int type with the base argument.

   1 >>> int('0xff',16)
   2 255
   3 >>> int('d484fa894e',16)
   4 912764078414

Another approach to decyphering "0xdecafbad" style hex strings, is to use eval:

   1 >>> eval("0xdecafbad ")
   2 3737844653L

However, this could be dangerous, depending on where you're getting your data from.

Here's a function that is safer:

   1 def hex_to_integer(h):
   2     """Convert a hex string to an integer.
   3 
   4     The hex string can be any length. It can start with an 0x, or not.
   5     Unrecognized characters will raise a ValueError.
   6 
   7     This function released into the public domain by it's author, Lion
   8     Kimbro.
   9     """
  10     num = 0  # Resulting integer
  11     h = h.lower()  # Hex string
  12     if h[:2] == "0x":
  13         h = h[2:]
  14     for c in h:  # Hex character
  15         num = num * 16
  16         if "0" <= c <= "9":
  17             num = num + (ord(c) - ord("0"))
  18         elif "a" <= c <= "f":
  19             num = num + (ord(c) - ord("a"))
  20             num = num + 10
  21         else:
  22             raise ValueError(c)
  23     return num

Integer to Bin String

It's high time Python supported binary literals (e.g. 0b10011000) and a bin() function!

   1 >>> def bin(a):
   2         s=''
   3         t={'0':'000','1':'001','2':'010','3':'011',
   4            '4':'100','5':'101','6':'110','7':'111'}
   5         for c in oct(a)[1:]:
   6                 s+=t[c]
   7         return s

this is the sort of thing we're looking for:

related modules:

see also: BitwiseOperators

BitManipulation (last edited 2016-09-02 07:19:33 by FelixWidmaier)

Unable to edit the page? See the FrontPage for instructions.