123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524 |
- --------------------------------
- bitstring module version history
- --------------------------------
- ---------------------------------------
- March 4th 2014: version 3.1.3 released
- ---------------------------------------
- This is another bug fix release.
- * Fix for problem with prepend for bitstrings with byte offsets in their data store.
- ---------------------------------------
- April 18th 2013: version 3.1.2 released
- ---------------------------------------
- This is another bug fix release.
- * Fix for problem where unpacking bytes would by eight times too long
- ---------------------------------------
- March 21st 2013: version 3.1.1 released
- ---------------------------------------
- This is a bug fix release.
- * Fix for problem where concatenating bitstrings sometimes modified method's arguments
- ------------------------------------------
- February 26th 2013: version 3.1.0 released
- ------------------------------------------
- This is a minor release with a couple of new features and some bug fixes.
- New 'pad' token
- ---------------
- This token can be used in reads and when packing/unpacking to indicate that
- you don't care about the contents of these bits. Any padding bits will just
- be skipped over when reading/unpacking or zero-filled when packing.
- >>> a, b = s.readlist('pad:5, uint:3, pad:1, uint:3')
- Here only two items are returned in the list - the padding bits are ignored.
- New clear and copy convenience methods
- --------------------------------------
- These methods have been introduced in Python 3.3 for lists and bytearrays,
- as more obvious ways of clearing and copying, and we mirror that change here.
- t = s.copy() is equivalent to t = s[:], and s.clear() is equivalent to del s[:].
- Other changes
- -------------
- * Some bug fixes.
- -----------------------------------------
- February 7th 2012: version 3.0.2 released
- -----------------------------------------
- This is a minor update that fixes a few bugs.
- * Fix for subclasses of bitstring classes behaving strangely (Issue 121).
- * Fix for excessive memory usage in rare cases (Issue 120).
- * Fixes for slicing edge cases.
- There has also been a reorganisation of the code to return it to a single
- 'bitstring.py' file rather than the package that has been used for the past
- several releases. This change shouldn't affect users directly.
- ------------------------------------------
- November 21st 2011: version 3.0.1 released
- ------------------------------------------
- This release fixed a small but very visible bug in bitstring printing.
- ------------------------------------------
- November 21st 2011: version 3.0.0 released
- ------------------------------------------
- This is a major release which breaks backward compatibility in a few places.
- Backwardly incompatible changes
- ===============================
- Hex, oct and bin properties don't have leading 0x, 0o and 0b
- ------------------------------------------------------------
- If you ask for the hex, octal or binary representations of a bitstring then
- they will no longer be prefixed with '0x', 0o' or '0b'. This was done as it
- was noticed that the first thing a lot of user code does after getting these
- representations was to cut off the first two characters before further
- processing.
- >>> a = BitArray('0x123')
- >>> a.hex, a.oct, a.bin
- ('123', '0443', '000100100011')
- Previously this would have returned ('0x123', '0o0443', '0b000100100011')
- This change might require some recoding, but it should all be simplifications.
- ConstBitArray renamed to Bits
- -----------------------------
- Previously Bits was an alias for ConstBitStream (for backward compatibility).
- This has now changed so that Bits and BitArray loosely correspond to the
- built-in types bytes and bytearray.
- If you were using streaming/reading methods on a Bits object then you will
- have to change it to a ConstBitStream.
- The ConstBitArray name is kept as an alias for Bits.
- Stepping in slices has conventional meaning
- -------------------------------------------
- The step parameter in __getitem__, __setitem__ and __delitem__ used to act
- as a multiplier for the start and stop parameters. No one seemed to use it
- though and so it has now reverted to the convential meaning for containers.
- If you are using step then recoding is simple: s[a:b:c] becomes s[a*c:b*c].
- Some examples of the new usage:
- >>> s = BitArray('0x0000')
- s[::4] = [1, 1, 1, 1]
- >>> s.hex
- '8888'
- >>> del s[8::2]
- >>> s.hex
- '880'
- New features
- ============
- New readto method
- -----------------
- This method is a mix between a find and a read - it searches for a bitstring
- and then reads up to and including it. For example:
- >>> s = ConstBitStream('0x47000102034704050647')
- >>> s.readto('0x47', bytealigned=True)
- BitStream('0x47')
- >>> s.readto('0x47', bytealigned=True)
- BitStream('0x0001020347')
- >>> s.readto('0x47', bytealigned=True)
- BitStream('0x04050647')
- pack function accepts an iterable as its format
- -----------------------------------------------
- Previously only a string was accepted as the format in the pack function.
- This was an oversight as it broke the symmetry between pack and unpack.
- Now you can use formats like this:
- fmt = ['hex:8', 'bin:3']
- a = pack(fmt, '47', '001')
- a.unpack(fmt)
- --------------------------------------
- June 18th 2011: version 2.2.0 released
- --------------------------------------
- This is a minor upgrade with a couple of new features.
- New interleaved exponential-Golomb interpretations
- --------------------------------------------------
- New bit interpretations for interleaved exponential-Golomb (as used in the
- Dirac video codec) are supplied via 'uie' and 'sie':
- >>> s = BitArray(uie=41)
- >>> s.uie
- 41
- >>> s.bin
- '0b00010001001'
- These are pretty similar to the non-interleaved versions - see the manual
- for more details. Credit goes to Paul Sargent for the patch.
- New package-level bytealigned variable
- --------------------------------------
- A number of methods take a 'bytealigned' parameter to indicate that they
- should only work on byte boundaries (e.g. find, replace, split). Previously
- this parameter defaulted to 'False'. Instead it now defaults to
- 'bitstring.bytealigned', which itself defaults to 'False', but can be changed
- to modify the default behaviour of the methods. For example:
- >>> a = BitArray('0x00 ff 0f ff')
- >>> a.find('0x0f')
- (4,) # found first not on a byte boundary
- >>> a.find('0x0f', bytealigned=True)
- (16,) # forced looking only on byte boundaries
- >>> bitstring.bytealigned = True # Change default behaviour
- >>> a.find('0x0f')
- (16,)
- >>> a.find('0x0f', bytealigned=False)
- (4,)
- If you're only working with bytes then this can help avoid some errors and
- save some typing!
- Other changes
- -------------
- * Fix for Python 3.2, correcting for a change to the binascii module.
- * Fix for bool initialisation from 0 or 1.
- * Efficiency improvements, including interning strategy.
- ------------------------------------------
- February 23rd 2011: version 2.1.1 released
- ------------------------------------------
- This is a release to fix a couple of bugs that were introduced in 2.1.0.
- * Bug fix: Reading using the 'bytes' token had been broken (Issue 102).
- * Fixed problem using some methods on ConstBitArrays.
- * Better exception handling for tokens missing values.
- * Some performance improvements.
- -----------------------------------------
- January 23rd 2011: version 2.1.0 released
- -----------------------------------------
- New class hierarchy introduced with simpler classes
- ---------------------------------------------------
- Previously there were just two classes, the immutable Bits which was the base
- class for the mutable BitString class. Both of these classes have the concept
- of a bit position, from which reads etc. take place so that the bitstring could
- be treated as if it were a file or stream.
- Two simpler classes have now been added which are purely bit containers and
- don't have a bit position. These are called ConstBitArray and BitArray. As you
- can guess the former is an immutable version of the latter.
- The other classes have also been renamed to better reflect their capabilities.
- Instead of BitString you can use BitStream, and instead of Bits you can use
- ConstBitStream. The old names are kept as aliases for backward compatibility.
- The classes hierarchy is:
- ConstBitArray
- / \
- / \
- BitArray ConstBitStream (formerly Bits)
- \ /
- \ /
- BitStream (formerly BitString)
- Other changes
- -------------
- A lot of internal reorganisation has taken place since the previous version,
- most of which won't be noticed by the end user. Some things you might see are:
- * New package structure. Previous versions have been a single file for the
- module and another for the unit tests. The module is now split into many
- more files so it can't be used just by copying bitstring.py any more.
- * To run the unit tests there is now a script called runtests.py in the test
- directory.
- * File based bitstring are now implemented in terms of an mmap. This should
- be just an implementation detail, but unfortunately for 32-bit versions of
- Python this creates a limit of 4GB on the files that can be used. The work
- around is either to get a 64-bit Python, or just stick with version 2.0.
- * The ConstBitArray and ConstBitStream classes no longer copy byte data when
- a slice or a read takes place, they just take a reference. This is mostly
- a very nice optimisation, but there are occassions where it could have an
- adverse effect. For example if a very large bitstring is created, a small
- slice taken and the original deleted. The byte data from the large
- bitstring would still be retained in memory.
- * Optimisations. Once again this version should be faster than the last.
- The module is still pure Python but some of the reorganisation was to make
- it more feasible to put some of the code into Cython or similar, so
- hopefully more speed will be on the way.
- --------------------------------------
- July 26th 2010: version 2.0.3 released
- --------------------------------------
- * Bug fix: Using peek and read for a single bit now returns a new bitstring
- as was intended, rather than the old behaviour of returning a bool.
- * Removed HTML docs from source archive - better to use the online version.
- --------------------------------------
- July 25th 2010: version 2.0.2 released
- --------------------------------------
- This is a major release, with a number of backwardly incompatible changes.
- The main change is the removal of many methods, all of which have simple
- alternatives. Other changes are quite minor but may need some recoding.
- There are a few new features, most of which have been made to help the
- stream-lining of the API. As always there are performance improvements and
- some API changes were made purely with future performance in mind.
- The backwardly incompatible changes are:
- -----------------------------------------
- * Methods removed.
- About half of the class methods have been removed from the API. They all have
- simple alternatives, so what remains is more powerful and easier to remember.
- The removed methods are listed here on the left, with their equivalent
- replacements on the right:
- s.advancebit() -> s.pos += 1
- s.advancebits(bits) -> s.pos += bits
- s.advancebyte() -> s.pos += 8
- s.advancebytes(bytes) -> s.pos += 8*bytes
- s.allunset([a, b]) -> s.all(False, [a, b])
- s.anyunset([a, b]) -> s.any(False, [a, b])
- s.delete(bits, pos) -> del s[pos:pos+bits]
- s.peekbit() -> s.peek(1)
- s.peekbitlist(a, b) -> s.peeklist([a, b])
- s.peekbits(bits) -> s.peek(bits)
- s.peekbyte() -> s.peek(8)
- s.peekbytelist(a, b) -> s.peeklist([8*a, 8*b])
- s.peekbytes(bytes) -> s.peek(8*bytes)
- s.readbit() -> s.read(1)
- s.readbitlist(a, b) -> s.readlist([a, b])
- s.readbits(bits) -> s.read(bits)
- s.readbyte() -> s.read(8)
- s.readbytelist(a, b) -> s.readlist([8*a, 8*b])
- s.readbytes(bytes) -> s.read(8*bytes)
- s.retreatbit() -> s.pos -= 1
- s.retreatbits(bits) -> s.pos -= bits
- s.retreatbyte() -> s.pos -= 8
- s.retreatbytes(bytes) -> s.pos -= 8*bytes
- s.reversebytes(start, end) -> s.byteswap(0, start, end)
- s.seek(pos) -> s.pos = pos
- s.seekbyte(bytepos) -> s.bytepos = bytepos
- s.slice(start, end, step) -> s[start:end:step]
- s.tell() -> s.pos
- s.tellbyte() -> s.bytepos
- s.truncateend(bits) -> del s[-bits:]
- s.truncatestart(bits) -> del s[:bits]
- s.unset([a, b]) -> s.set(False, [a, b])
- Many of these methods have been deprecated for the last few releases, but
- there are some new removals too. Any recoding needed should be quite
- straightforward, so while I apologise for the hassle, I had to take the
- opportunity to streamline and rationalise what was becoming a bit of an
- overblown API.
- * set / unset methods combined.
- The set/unset methods have been combined in a single method, which now
- takes a boolean as its first argument:
- s.set([a, b]) -> s.set(1, [a, b])
- s.unset([a, b]) -> s.set(0, [a, b])
- s.allset([a, b]) -> s.all(1, [a, b])
- s.allunset([a, b]) -> s.all(0, [a, b])
- s.anyset([a, b]) -> s.any(1, [a, b])
- s.anyunset([a, b]) -> s.any(0, [a, b])
- * all / any only accept iterables.
- The all and any methods (previously called allset, allunset, anyset and
- anyunset) no longer accept a single bit position. The recommended way of
- testing a single bit is just to index it, for example instead of:
- >>> if s.all(True, i):
- just use
- >>> if s[i]:
- If you really want to you can of course use an iterable with a single
- element, such as 's.any(False, [i])', but it's clearer just to write
- 'not s[i]'.
- * Exception raised on reading off end of bitstring.
- If a read or peek goes beyond the end of the bitstring then a ReadError
- will be raised. The previous behaviour was that the rest of the bitstring
- would be returned and no exception raised.
- * BitStringError renamed to Error.
- The base class for errors in the bitstring module is now just Error, so
- it will likely appears in your code as bitstring.Error instead of
- the rather repetitive bitstring.BitStringError.
- * Single bit slices and reads return a bool.
- A single index slice (such as s[5]) will now return a bool (i.e. True or
- False) rather than a single bit bitstring. This is partly to reflect the
- style of the bytearray type, which returns an integer for single items, but
- mostly to avoid common errors like:
- >>> if s[0]:
- ... do_something()
- While the intent of this code snippet is quite clear (i.e. do_something if
- the first bit of s is set) under the old rules s[0] would be true as long
- as s wasn't empty. That's because any one-bit bitstring was true as it was a
- non-empty container. Under the new rule s[0] is True if s starts with a '1'
- bit and False if s starts with a '0' bit.
- The change does not affect reads and peeks, so s.peek(1) will still return
- a single bit bitstring, which leads on to the next item...
- * Empty bitstrings or bitstrings with only zero bits are considered False.
- Previously a bitstring was False if it had no elements, otherwise it was True.
- This is standard behaviour for containers, but wasn't very useful for a container
- of just 0s and 1s. The new behaviour means that the bitstring is False if it
- has no 1 bits. This means that code like this:
- >>> if s.peek(1):
- ... do_something()
- should work as you'd expect. It also means that Bits(1000), Bits(0x00) and
- Bits('uint:12=0') are all also False. If you need to check for the emptiness of
- a bitstring then instead check the len property:
- if s -> if s.len
- if not s -> if not s.len
- * Length and offset disallowed for some initialisers.
- Previously you could create bitstring using expressions like:
- >>> s = Bits(hex='0xabcde', offset=4, length=13)
- This has now been disallowed, and the offset and length parameters may only
- be used when initialising with bytes or a file. To replace the old behaviour
- you could instead use
- >>> s = Bits(hex='0xabcde')[4:17]
- * Renamed 'format' parameter 'fmt'.
- Methods with a 'format' parameter have had it renamed to 'fmt', to prevent
- hiding the built-in 'format'. Affects methods unpack, read, peek, readlist,
- peeklist and byteswap and the pack function.
- * Iterables instead of *format accepted for some methods.
- This means that for the affected methods (unpack, readlist and peeklist) you
- will need to use an iterable to specify multiple items. This is easier to
- show than to describe, so instead of
- >>> a, b, c, d = s.readlist('uint:12', 'hex:4', 'bin:7')
- you would instead write
- >>> a, b, c, d = s.readlist(['uint:12', 'hex:4', 'bin:7'])
- Note that you could still use the single string 'uint:12, hex:4, bin:7' if
- you preferred.
- * Bool auto-initialisation removed.
- You can no longer use True and False to initialise single bit bitstrings.
- The reasoning behind this is that as bool is a subclass of int, it really is
- bad practice to have Bits(False) be different to Bits(0) and to have Bits(True)
- different to Bits(1).
- If you have used bool auto-initialisation then you will have to be careful to
- replace it as the bools will now be interpreted as ints, so Bits(False) will
- be empty (a bitstring of length 0), and Bits(True) will be a single zero bit
- (a bitstring of length 1). Sorry for the confusion, but I think this will
- prevent bigger problems in the future.
- There are a few alternatives for creating a single bit bitstring. My favourite
- it to use a list with a single item:
- Bits(False) -> Bits([0])
- Bits(True) -> Bits([1])
- * New creation from file strategy
- Previously if you created a bitstring from a file, either by auto-initialising
- with a file object or using the filename parameter, the file would not be read
- into memory unless you tried to modify it, at which point the whole file would
- be read.
- The new behaviour depends on whether you create a Bits or a BitString from the
- file. If you create a Bits (which is immutable) then the file will never be
- read into memory. This allows very large files to be opened for examination
- even if they could never fit in memory.
- If however you create a BitString, the whole of the referenced file will be read
- to store in memory. If the file is very big this could take a long time, or fail,
- but the idea is that in saying you want the mutable BitString you are implicitly
- saying that you want to make changes and so (for now) we need to load it into
- memory.
- The new strategy is a bit more predictable in terms of performance than the old.
- The main point to remember is that if you want to open a file and don't plan to
- alter the bitstring then use the Bits class rather than BitString.
- Just to be clear, in neither case will the contents of the file ever be changed -
- if you want to output the modified BitString then use the tofile method, for
- example.
- * find and rfind return a tuple instead of a bool.
- If a find is unsuccessful then an empty tuple is returned (which is False in a
- boolean sense) otherwise a single item tuple with the bit position is returned
- (which is True in a boolean sense). You shouldn't need to recode unless you
- explicitly compared the result of a find to True or False, for example this
- snippet doesn't need to be altered:
- >>> if s.find('0x23'):
- ... print(s.bitpos)
-
- but you could now instead use
- >>> found = s.find('0x23')
- >>> if found:
- ... print(found[0])
- The reason for returning the bit position in a tuple is so that finding at
- position zero can still be True - it's the tuple (0,) - whereas not found can
- be False - the empty tuple ().
- The new features in this release are:
- -------------------------------------
- * New count method.
- This method just counts the number of 1 or 0 bits in the bitstring.
- >>> s = Bits('0x31fff4')
- >>> s.count(1)
- 16
- * read and peek methods accept integers.
- The read, readlist, peek and peeklist methods now accept integers as parameters
- to mean "read this many bits and return a bitstring". This has allowed a number
- of methods to be removed from this release, so for example instead of:
- >>> a, b, c = s.readbits(5, 6, 7)
- >>> if s.peekbit():
- ... do_something()
- you should write:
- >>> a, b, c = s.readlist([5, 6, 7])
- >>> if s.peek(1):
- ... do_something()
- * byteswap used to reverse all bytes.
- The byteswap method now allows a format specifier of 0 (the default) to signify
- that all of the whole bytes should be reversed. This means that calling just
- byteswap() is almost equivalent to the now removed bytereverse() method (a small
- difference is that byteswap won't raise an exception if the bitstring isn't a
- whole number of bytes long).
- * Auto initialise with bytearray or (for Python 3 only) bytes.
- So rather than writing:
- >>> a = Bits(bytes=some_bytearray)
- you can just write
- >>> a = Bits(some_bytearray)
- This also works for the bytes type, but only if you're using Python 3.
- For Python 2 it's not possible to distinguish between a bytes object and a
- str. For this reason this method should be used with some caution as it will
- make you code behave differently with the different major Python versions.
- >>> b = Bits(b'abcd\x23\x00') # Only Python 3!
-
- * set, invert, all and any default to whole bitstring.
- This means that you can for example write:
- >>> a = BitString(100) # 100 zero bits
- >>> a.set(1) # set all bits to 1
- >>> a.all(1) # are all bits set to 1?
- True
- >>> a.any(0) # are any set to 0?
- False
- >>> a.invert() # invert every bit
-
- * New exception types.
- As well as renaming BitStringError to just Error
- there are also new exceptions which use Error as a base class.
- These can be caught in preference to Error if you need finer control.
- The new exceptions sometimes also derive from built-in exceptions:
- ByteAlignError(Error) - whole byte position or length needed.
- ReadError(Error, IndexError) - reading or peeking off the end of
- the bitstring.
- CreationError(Error, ValueError) - inappropriate argument during
- bitstring creation.
- InterpretError(Error, ValueError) - inappropriate interpretation of
- binary data.
- --------------------------------------------------------------
- March 18th 2010: version 1.3.0 for Python 2.6 and 3.x released
- --------------------------------------------------------------
- New features:
- * byteswap method for changing endianness.
- Changes the endianness in-place according to a format string or
- integer(s) giving the byte pattern. See the manual for details.
- >>> s = BitString('0x00112233445566')
- >>> s.byteswap(2)
- 3
- >>> s
- BitString('0x11003322554466')
- >>> s.byteswap('h')
- 3
- >>> s
- BitString('0x00112233445566')
- >>> s.byteswap([2, 5])
- 1
- >>> s
- BitString('0x11006655443322')
- * Multiplicative factors in bitstring creation and reading.
- For example:
- >>> s = Bits('100*0x123')
- * Token grouping using parenthesis.
- For example:
- >>> s = Bits('3*(uint:6=3, 0b1)')
- * Negative slice indices allowed.
- The start and end parameters of many methods may now be negative, with the
- same meaning as for negative slice indices. Affects all methods with these
- parameters.
- * Sequence ABCs used.
- The Bits class now derives from collections.Sequence, while the BitString
- class derives from collections.MutableSequence.
- * Keywords allowed in readlist, peeklist and unpack.
- Keywords for token lengths are now permitted when reading. So for example,
- you can write
- >>> s = bitstring.pack('4*(uint:n)', 2, 3, 4, 5, n=7)
- >>> s.unpack('4*(uint:n)', n=7)
- [2, 3, 4, 5]
- * start and end parameters added to rol and ror.
- * join function accepts other iterables.
- Also its parameter has changed from 'bitstringlist' to 'sequence'. This is
- technically a backward incompatibility in the unlikely event that you are
- referring to the parameter by name.
- * __init__ method accepts keywords.
- Rather than a long list of initialisers the __init__ methods now use a
- **kwargs dictionary for all initialisers except 'auto'. This should have no
- effect, except that this is a small backward incompatibility if you use
- positional arguments when initialising with anything other than auto
- (which would be rather unusual).
- * More optimisations.
- * Bug fixed in replace method (it could fail if start != 0).
- ----------------------------------------------------------------
- January 19th 2010: version 1.2.0 for Python 2.6 and 3.x released
- ----------------------------------------------------------------
- * New 'Bits' class.
- Introducing a brand new class, Bits, representing an immutable sequence of
- bits.
- The Bits class is the base class for the mutable BitString. The differences
- between Bits and BitStrings are:
- 1) Bits are immutable, so once they have been created their value cannot change.
- This of course means that mutating methods (append, replace, del etc.) are not
- available for Bits.
- 2) Bits are hashable, so they can be used in sets and as keys in dictionaries.
- 3) Bits are potentially more efficient than BitStrings, both in terms of
- computation and memory. The current implementation is only marginally
- more efficient though - this should improve in future versions.
- You can switch from Bits to a BitString or vice versa by constructing a new
- object from the old.
- >>> s = Bits('0xabcd')
- >>> t = BitString(s)
- >>> t.append('0xe')
- >>> u = Bits(t)
- The relationship between Bits and BitString is supposed to loosely mirror that
- between bytes and bytearray in Python 3.
- * Deprecation messages turned on.
- A number of methods have been flagged for removal in version 2. Deprecation
- warnings will now be given, which include an alternative way to do the same
- thing. All of the deprecated methods have simpler equivalent alternatives.
- >>> t = s.slice(0, 2)
- __main__:1: DeprecationWarning: Call to deprecated function slice.
- Instead of 's.slice(a, b, c)' use 's[a:b:c]'.
- The deprecated methods are: advancebit, advancebits, advancebyte, advancebytes,
- retreatbit, retreatbits, retreatbyte, retreatbytes, tell, seek, slice, delete,
- tellbyte, seekbyte, truncatestart and truncateend.
- * Initialise from bool.
- Booleans have been added to the list of types that can 'auto'
- initialise a bitstring.
- >>> zerobit = BitString(False)
- >>> onebit = BitString(True)
- * Improved efficiency.
- More methods have been speeded up, in particular some deletions and insertions.
- * Bug fixes.
- A rare problem with truncating the start of bitstrings was fixed.
- A possible problem outputting the final byte in tofile() was fixed.
- -----------------------------------------------------------------
- December 22nd 2009: version 1.1.3 for Python 2.6 and 3.x released
- -----------------------------------------------------------------
- This version hopefully fixes an installation problem for platforms with
- case-sensitive file systems. There are no new features or other bug fixes.
- -----------------------------------------------------------------
- December 18th 2009: version 1.1.2 for Python 2.6 and 3.x released
- -----------------------------------------------------------------
- This is a minor update with (almost) no new features.
- * Improved efficiency.
- The speed of many typical operations has been increased, some substantially.
- * Initialise from integer.
- A BitString of '0' bits can be created using just an integer to give the length
- in bits. So instead of
- >>> s = BitString(length=100)
- you can write just
- >>> s = BitString(100)
- This matches the behaviour of bytearrays and (in Python 3) bytes.
- * A defect related to using the set / unset functions on BitStrings initialised
- from a file has been fixed.
- -----------------------------------------------------------------
- November 24th 2009: version 1.1.0 for Python 2.6 and 3.x released
- -----------------------------------------------------------------
- Note that this version will not work for Python 2.4 or 2.5. There may be an
- update for these Python versions some time next year, but it's not a priorty
- quite yet. Also note that only one version is now provided, which works for
- Python 2.6 and 3.x (done with the minimum of hackery!)
- * Improved efficiency.
- A fair number of functions have improved efficiency, some quite dramatically.
- * New bit setting and checking functions.
- Although these functions don't do anything that couldn't be done before, they
- do make some common use cases much more efficient. If you need to set or check
- single bits then these are the functions you need.
- set / unset : Set bit(s) to 1 or 0 respectively.
- allset / allunset : Check if all bits are 1 or all 0.
- anyset / anyunset : Check if any bits are 1 or any 0.
- >>> s = BitString(length=1000)
- >>> s.set((10, 100, 44, 12, 1))
- >>> s.allunset((2, 22, 222))
- True
- >>> s.anyset(range(7, 77))
- True
- * New rotate functions.
- ror / rol : Rotate bits to the right or left respectively.
- >>> s = BitString('0b100000000')
- >>> s.ror(2)
- >>> s.bin
- '0b001000000'
- >>> s.rol(5)
- >>> s.bin
- '0b000000100'
- * Floating point interpretations.
- New float initialisations and interpretations are available. These only work
- for BitStrings of length 32 or 64 bits.
- >>> s = BitString(float=0.2, length=64)
- >>> s.float
- 0.200000000000000001
- >>> t = bitstring.pack('<3f', -0.4, 1e34, 17.0)
- >>> t.hex
- '0xcdccccbedf84f67700008841'
- * 'bytes' token reintroduced.
- This token returns a bytes object (equivalent to a str in Python 2.6).
- >>> s = BitString('0x010203')
- >>> s.unpack('bytes:2, bytes:1')
- ['\x01\x02', '\x03']
- * 'uint' is now the default token type.
- So for example these are equivalent:
- a, b = s.readlist('uint:12, uint:12')
- a, b = s.readlist('12, 12')
- --------------------------------------------------------
- October 10th 2009: version 1.0.1 for Python 3.x released
- --------------------------------------------------------
- This is a straight port of version 1.0.0 to Python 3.
- For changes since the last Python 3 release read all the way down in this
- document to version 0.4.3.
- This version will also work for Python 2.6, but there's no advantage to using
- it over the 1.0.0 release. It won't work for anything before 2.6.
- -------------------------------------------------------
- October 9th 2009: version 1.0.0 for Python 2.x released
- -------------------------------------------------------
- Version 1 is here!
- This is the first release not to carry the 'beta' tag. It contains a couple of
- minor new features but is principally a release to fix the API. If you've been
- using an older version then you almost certainly will have to recode a bit. If
- you're not ready to do that then you may wish to delay updating.
- So the bad news is that there are lots of small changes to the API. The good
- news is that all the changes are pretty trivial, the new API is cleaner and
- more 'Pythonic', and that by making it version 1.0 I'm promising not to
- tweak it again for some time.
- ** API Changes **
- * New read / peek functions for returning multiple items.
- The functions read, readbits, readbytes, peek, peekbits and peekbytes now only
- ever return a single item, never a list.
- The new functions readlist, readbitlist, readbytelist, peeklist, peekbitlist
- and peekbytelist can be used to read multiple items and will always return a
- list.
- So a line like:
- >>> a, b = s.read('uint:12, hex:32')
- becomes
- >>> a, b = s.readlist('uint:12, hex:32')
- * Renaming / removing functions.
- Functions have been renamed as follows:
- seekbit -> seek
- tellbit -> tell
- reversebits -> reverse
- deletebits -> delete
- tostring -> tobytes
- and a couple have been removed altogether:
- deletebytes - use delete instead.
- empty - use 'not s' rather than 's.empty()'.
- * Renaming parameters.
- The parameters 'startbit' and 'endbit' have been renamed 'start' and 'end'.
- This affects the functions slice, find, findall, rfind, reverse, cut and split.
- The parameter 'bitpos' has been renamed to 'pos'. The affects the functions
- seek, tell, insert, overwrite and delete.
- * Mutating methods return None rather than self.
- This means that you can't chain functions together so
- >>> s.append('0x00').prepend('0xff')
- >>> t = s.reverse()
- Needs to be rewritten
- >>> s.append('0x00')
- >>> s.prepend('0xff)
- >>> s.reverse()
- >>> t = s
- Affects truncatestart, truncateend, insert, overwrite, delete, append,
- prepend, reverse and reversebytes.
- * Properties renamed.
- The 'data' property has been renamed to 'bytes'. Also if the BitString is not a
- whole number of bytes then a ValueError exception will be raised when using
- 'bytes' as a 'getter'.
- Properties 'len' and 'pos' have been added to replace 'length' and 'bitpos',
- although the longer names have not been removed so you can continue to use them
- if you prefer.
- * Other changes.
- The unpack function now always returns a list, never a single item.
- BitStrings are now 'unhashable', so calling hash on one or making a set will
- fail.
- The colon separating the token name from its length is now mandatory. So for
- example BitString('uint12=100') becomes BitString('uint:12=100').
- Removed support for the 'bytes' token in format strings. Instead of
- s.read('bytes:4') use s.read('bits:32').
- ** New features **
- * Added endswith and startswith functions.
- These do much as you'd expect; they return True or False depending on whether
- the BitString starts or ends with the parameter.
- >>> BitString('0xef342').startswith('0b11101')
- True
- ----------------------------------------------------------
- September 11th 2009: version 0.5.2 for Python 2.x released
- ----------------------------------------------------------
- Finally some tools for dealing with endianness!
- * New interpretations are now available for whole-byte BitStrings that treat
- them as big, little, or native-endian.
- >>> big = BitString(intbe=1, length=16) # or BitString('intbe:16=1') if you prefer.
- >>> little = BitString(intle=1, length=16)
- >>> print big.hex, little.hex
- 0x0001 0x0100
- >>> print big.intbe, little.intle
- 1 1
- * 'Struct'-like compact format codes
- To save some typing when using pack, unpack, read and peek, compact format
- codes based on those used in the struct and array modules have been added.
- These must start with a character indicating the endianness (>, < or @ for
- big, little and native-endian), followed by characters giving the format:
- b 1-byte signed int
- B 1-byte unsigned int
- h 2-byte signed int
- H 2-byte unsigned int
- l 4-byte signed int
- L 4-byte unsigned int
- q 8-byte signed int
- Q 8-byte unsigned int
- For example:
- >>> s = bitstring.pack('<4h', 0, 1, 2, 3)
- creates a BitString with four little-endian 2-byte integers. While
- >>> x, y, z = s.read('>hhl')
- reads them back as two big-endian two-byte integers and one four-byte big
- endian integer.
- Of course you can combine this new format with the old ones however you like:
- >>> s.unpack('<h, intle:24, uint:5, bin')
- [0, 131073, 0, '0b0000000001100000000']
- -------------------------------------------------------
- August 26th 2009: version 0.5.1 for Python 2.x released
- -------------------------------------------------------
- This update introduces pack and unpack functions for creating and dissembling
- BitStrings.
- * New pack() and unpack() functions.
- The module level pack function provides a flexible new method for creating
- BitStrings. Tokens for BitString 'literals' can be used in the same way as in
- the constructor.
- >>> from bitstring import BitString, pack
- >>> a = pack('0b11, 0xff, 0o77, int:5=-1, se=33')
- You can also leave placeholders in the format, which will be filled in by
- the values provided.
- >>> b = pack('uint:10, hex:4', 33, 'f')
- Finally you can use a dictionary or keywords.
- >>> c = pack('bin=a, hex=b, bin=a', a='010', b='ef')
- The unpack function is similar to the read function except that it always
- unpacks from the start of the BitString.
- >>> x, y = b.unpack('uint:10, hex')
- If a token is given without a length (as above) then it will expand to fill the
- remaining bits in the BitString. This also now works with read() and peek().
- * New tostring() and tofile() functions.
- The tostring() function just returns the data as a string, with up to seven
- zero bits appended to byte align. The tofile() function does the same except
- writes to a file object.
- >>> f = open('myfile', 'wb')
- >>> BitString('0x1234ff').tofile(f)
- * Other changes.
- The use of '=' is now mandatory in 'auto' initialisers. Tokens like 'uint12 100' will
- no longer work. Also the use of a ':' before the length is encouraged, but not yet
- mandated. So the previous example should be written as 'uint:12=100'.
- The 'auto' initialiser will now take a file object.
- >>> f = open('myfile', 'rb')
- >>> s = BitString(f)
- -----------------------------------------------------
- July 19th 2009: version 0.5.0 for Python 2.x released
- -----------------------------------------------------
- This update breaks backward compatibility in a couple of areas. The only one
- you probably need to be concerned about is the change to the default for
- bytealigned in find, replace, split, etc.
- See the user manual for more details on each of these items.
- * Expanded abilities of 'auto' initialiser.
- More types can be initialised through the 'auto' initialiser. For example
- instead of
- >>> a = BitString(uint=44, length=16)
- you can write
- >>> a = BitString('uint16=44')
- Also, different comma-separated tokens will be joined together, e.g.
- >>> b = BitString('0xff') + 'int8=-5'
- can be written
- >>> b = BitString('0xff, int8=-5')
- * New formatted read() and peek() functions.
- These takes a format string similar to that used in the auto initialiser.
- If only one token is provided then a single value is returned, otherwise a
- list of values is returned.
- >>> start_code, width, height = s.read('hex32, uint12, uint12')
- is equivalent to
- >>> start_code = s.readbits(32).hex
- >>> width = s.readbits(12).uint
- >>> height = s.readbits(12).uint
- The tokens are:
- int n : n bits as an unsigned integer.
- uint n : n bits as a signed integer.
- hex n : n bits as a hexadecimal string.
- oct n : n bits as an octal string.
- bin n : n bits as a binary string.
- ue : next bits as an unsigned exp-Golomb.
- se : next bits as a signed exp-Golomb.
- bits n : n bits as a new BitString.
- bytes n : n bytes as a new BitString.
- See the user manual for more details.
- * hex() and oct() functions removed.
- The special functions for hex() and oct() have been removed. Please use the
- hex and oct properties instead.
- >>> hex(s)
- becomes
- >>> s.hex
- * join made a member function.
- The join function must now be called on a BitString object, which will be
- used to join the list together. You may need to recode slightly:
- >>> s = bitstring.join('0x34', '0b1001', '0b1')
- becomes
- >>> s = BitString().join('0x34', '0b1001', '0b1')
- * More than one value allowed in readbits, readbytes, peekbits and peekbytes
- If you specify more than one bit or byte length then a list of BitStrings will
- be returned.
- >>> a, b, c = s.readbits(10, 5, 5)
- is equivalent to
- >>> a = readbits(10)
- >>> b = readbits(5)
- >>> c = readbits(5)
- * bytealigned defaults to False, and is at the end of the parameter list
- Functions that have a bytealigned paramater have changed so that it now
- defaults to False rather than True. Also its position in the parameter list
- has changed to be at the end. You may need to recode slightly (sorry!)
- * readue and readse functions have been removed
- Instead you should use the new read function with a 'ue' or 'se' token:
- >>> i = s.readue()
- becomes
- >>> i = s.read('ue')
- This is more flexible as you can read multiple items in one go, plus you can
- now also use the peek function with ue and se.
- * Minor bugs fixed.
- See the issue tracker for more details.
- -----------------------------------------------------
- June 15th 2009: version 0.4.3 for Python 2.x released
- -----------------------------------------------------
- This is a minor update. This release is the first to bundle the bitstring
- manual. This is a PDF and you can find it in the docs directory.
- Changes in version 0.4.3
- * New 'cut' function
- This function returns a generator for constant sized chunks of a BitString.
- >>> for byte in s.cut(8):
- ... do_something_with(byte)
- You can also specify a startbit and endbit, as well as a count, which limits
- the number of items generated:
- >>> first100TSPackets = list(s.cut(188*8, count=100))
- * 'slice' function now equivalent to __getitem__.
- This means that a step can also be given to the slice function so that the
- following are now the same thing, and it's just a personal preference which
- to use:
- >>> s1 = s[a:b:c]
- >>> s2 = s.slice(a, b, c)
- * findall gets a 'count' parameter.
- So now
- >>> list(a.findall(s, count=n))
- is equivalent to
- >>> list(a.findall(s))[:n]
- except that it won't need to generate the whole list and so is much more
- efficient.
- * Changes to 'split'.
- The split function now has a 'count' parameter rather than 'maxsplit'. This
- makes the interface closer to that for cut, replace and findall. The final item
- generated is now no longer the whole of the rest of the BitString.
- * A couple of minor bugs were fixed. See the issue tracker for details.
- ----------------------------------------------------
- May 25th 2009: version 0.4.2 for Python 2.x released
- ----------------------------------------------------
- This is a minor update, and almost doesn't break compatibility with version
- 0.4.0, but with the slight exception of findall() returning a generator,
- detailed below.
- Changes in version 0.4.2
- * Stepping in slices
- The use of the step parameter (also known as the stride) in slices has been
- added. Its use is a little non-standard as it effectively gives a multiplicative
- factor to apply to the start and stop parameters, rather than skipping over
- bits.
- For example this makes it much more convenient if you want to give slices in
- terms of bytes instead of bits. Instead of writing s[a*8:b*8] you can use
- s[a:b:8].
- When using a step the BitString is effectively truncated to a multiple of the
- step, so s[::8] is equal to s if s is an integer number of bytes, otherwise it
- is truncated by up to 7 bits. So the final seven complete 16-bit words could be
- written as s[-7::16]
- Negative slices are also allowed, and should do what you'd expect. So for
- example s[::-1] returns a bit-reversed copy of s (which is similar to
- s.reversebits(), which does the same operation on s in-place). As another
- example, to get the first 10 bytes in reverse byte order you could use
- s_bytereversed = s[0:10:-8].
- * Removed restrictions on offset
- You can now specify an offset of greater than 7 bits when creating a BitString,
- and the use of offset is also now permitted when using the filename initialiser.
- This is useful when you want to create a BitString from the middle of a file
- without having to read the file into memory.
- >>> f = BitString(filename='reallybigfile', offset=8000000, length=32)
- * Integers can be assigned to slices
- You can now assign an integer to a slice of a BitString. If the integer doesn't
- fit in the size of slice given then a ValueError exception is raised. So this
- is now allowed and works as expected:
- >>> s[8:16] = 106
- and is equivalent to
- >>> s[8:16] = BitString(uint=106, length=8)
- * Less exceptions raised
- Some changes have been made to slicing so that less exceptions are raised,
- bringing the interface closer to that for lists. So for example trying to delete
- past the end of the BitString will now just delete to the end, rather than
- raising a ValueError.
- * Initialisation from lists and tuples
- A new option for the auto initialiser is to pass it a list or tuple. The items
- in the list or tuple are evaluated as booleans and the bits in the BitString are
- set to 1 for True items and 0 for False items. This can be used anywhere the
- auto initialiser can currently be used. For example:
- >>> a = BitString([True, 7, False, 0, ()]) # 0b11000
- >>> b = a + ['Yes', ''] # Adds '0b10'
- >>> (True, True, False) in a
- True
- * Miscellany
- reversebits() now has optional startbit and endbit parameters.
- As an optimisation findall() will return a generator, rather than a list. If you
- still want the whole list then of course you can just call list() on the
- generator.
- Improved efficiency of rfind().
- A couple of minor bugs were fixed. See the issue tracker for details.
- -----------------------------------------------------
- April 23rd 2009: Python 3 only version 0.4.1 released
- -----------------------------------------------------
- This version is just a port of version 0.4.0 to Python 3. All the unit tests
- pass, but beyond that only limited ad hoc testing has been done and so it
- should be considered an experimental release. That said, the unit test
- coverage is very good - I'm just not sure if anyone even wants a Python 3
- version!
- ---------------------------------------
- April 11th 2009: version 0.4.0 released
- ---------------------------------------
- Changes in version 0.4.0
- * New functions
- Added rfind(), findall(), replace(). These do pretty much what you'd expect -
- see the docstrings or the wiki for more information.
- * More special functions
- Some missing functions were added: __repr__, __contains__, __rand__,
- __ror__, _rxor__ and __delitem__.
- * Miscellany
- A couple of small bugs were fixed (see the issue tracker).
- ----
- There are some small backward incompatibilities relative to version 0.3.2:
- * Combined find() and findbytealigned()
- findbytealigned() has been removed, and becomes part of find(). The default
- start position has changed on both find() and split() to be the start of the
- BitString. You may need to recode:
- >>> s1.find(bs)
- >>> s2.findbytealigned(bs)
- >>> s2.split(bs)
- becomes
- >>> s1.find(bs, bytealigned=False, startbit=s1.bitpos)
- >>> s2.find(bs, startbit=s1.bitpos) # bytealigned defaults to True
- >>> s2.split(bs, startbit=s2.bitpos)
- * Reading off end of BitString no longer raises exception.
- Previously a read or peek function that encountered the end of the BitString
- would raise a ValueError. It will now instead return the remainder of the
- BitString, which could be an empty BitString. This is closer to the file
- object interface.
- * Removed visibility of offset.
- The offset property was previously read-only, and has now been removed from
- public view altogether. As it is used internally for efficiency reasons you
- shouldn't really have needed to use it. If you do then use the _offset parameter
- instead (with caution).
- ---------------------------------------
- March 11th 2009: version 0.3.2 released
- ---------------------------------------
- Changes in version 0.3.2
- * Better performance
- A number of functions (especially find() and findbytealigned()) have been sped
- up considerably.
- * Bit-wise operations
- Added support for bit-wise AND (&), OR (|) and XOR (^). For example:
- >>> a = BitString('0b00111')
- >>> print a & '0b10101'
- 0b00101
- * Miscellany
- Added seekbit() and seekbyte() functions. These complement the 'advance' and
- 'retreat' functions, although you can still just use bitpos and bytepos
- properties directly.
- >>> a.seekbit(100) # Equivalent to a.bitpos = 100
- Allowed comparisons between BitString objects and strings. For example this
- will now work:
- >>> a = BitString('0b00001111')
- >>> a == '0x0f'
- True
- ------------------------------------------
- February 26th 2009: version 0.3.1 released
- ------------------------------------------
- Changes in version 0.3.1
- This version only adds features and fixes bugs relative to 0.3.0, and doesn't
- break backwards compatibility.
- * Octal interpretation and initialisation
- The oct property now joins bin and hex. Just prefix octal numbers with '0o'.
- >>> a = BitString('0o755')
- >>> print a.bin
- 0b111101101
- * Simpler copying
- Rather than using b = copy.copy(a) to create a copy of a BitString, now you
- can just use b = BitString(a).
- * More special methods
- Lots of new special methods added, for example bit-shifting via << and >>,
- equality testing via == and !=, bit inversion (~) and concatenation using *.
- Also __setitem__ is now supported so BitString objects can be modified using
- standard index notation.
- * Proper installer
- Finally got round to writing the distutils script. To install just
- python setup.py install.
- ------------------------------------------
- February 15th 2009: version 0.3.0 released
- ------------------------------------------
- Changes in version 0.3.0
- * Simpler initialisation from binary and hexadecimal
- The first argument in the BitString constructor is now called auto and will
- attempt to interpret the type of a string. Prefix binary numbers with '0b'
- and hexadecimals with '0x'.
- >>> a = BitString('0b0') # single zero bit
- >>> b = BitString('0xffff') # two bytes
- Previously the first argument was data, so if you relied on this then you
- will need to recode:
- >>> a = BitString('\x00\x00\x01\xb3') # Don't do this any more!
- becomes
- >>> a = BitString(data='\x00\x00\x01\xb3')
- or just
- >>> a = BitString('0x000001b3')
- This new notation can also be used in functions that take a BitString as an
- argument. For example:
- >>> a = BitString('0x0011') + '0xff'
- >>> a.insert('0b001', 6)
- >>> a.find('0b1111')
- * BitString made more mutable
- The functions append, deletebits, insert, overwrite, truncatestart and
- truncateend now modify the BitString that they act upon. This allows for
- cleaner and more efficient code, but you may need to rewrite slightly if you
- depended upon the old behaviour:
- >>> a = BitString(hex='0xffff')
- >>> a = a.append(BitString(hex='0x00'))
- >>> b = a.deletebits(10, 10)
- becomes:
- >>> a = BitString('0xffff')
- >>> a.append('0x00')
- >>> b = copy.copy(a)
- >>> b.deletebits(10, 10)
- Thanks to Frank Aune for suggestions in this and other areas.
- * Changes to printing
- The binary interpretation of a BitString is now prepended with '0b'. This is
- in keeping with the Python 2.6 (and 3.0) bin function. The prefix is optional
- when initialising using 'bin='.
- Also, if you just print a BitString with no interpretation it will pick
- something appropriate - hex if it is an integer number of bytes, otherwise
- binary. If the BitString representation is very long it will be truncated
- by '...' so it is only an approximate interpretation.
- >>> a = BitString('0b0011111')
- >>> print a
- 0b0011111
- >>> a += '0b0'
- >>> print a
- 0x3e
- * More convenience functions
- Some missing functions such as advancebit and deletebytes have been added. Also
- a number of peek functions make an appearance as have prepend and reversebits.
- See the Tutorial for more details.
- -----------------------------------------
- January 13th 2009: version 0.2.0 released
- -----------------------------------------
- Some fairly minor updates, not really deserving of a whole version point update.
- ------------------------------------------
- December 29th 2008: version 0.1.0 released
- ------------------------------------------
- First release!
|