test_bitstream.py 135 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940
  1. #!/usr/bin/env python
  2. import unittest
  3. import sys
  4. sys.path.insert(0, '..')
  5. import bitstring
  6. import copy
  7. import os
  8. import collections
  9. from bitstring import BitStream, ConstBitStream, pack
  10. from bitstring import ByteStore, offsetcopy
  11. class FlexibleInitialisation(unittest.TestCase):
  12. def testFlexibleInitialisation(self):
  13. a = BitStream('uint:8=12')
  14. c = BitStream(' uint : 8 = 12')
  15. self.assertTrue(a == c == BitStream(uint=12, length=8))
  16. self.assertEqual(a.uint, 12)
  17. a = BitStream(' int:2= -1')
  18. b = BitStream('int :2 = -1')
  19. c = BitStream(' int: 2 =-1 ')
  20. self.assertTrue(a == b == c == BitStream(int=-1, length=2))
  21. def testFlexibleInitialisation2(self):
  22. h = BitStream('hex=12')
  23. o = BitStream('oct=33')
  24. b = BitStream('bin=10')
  25. self.assertEqual(h, '0x12')
  26. self.assertEqual(o, '0o33')
  27. self.assertEqual(b, '0b10')
  28. def testFlexibleInitialisation3(self):
  29. for s in ['se=-1', ' se = -1 ', 'se = -1']:
  30. a = BitStream(s)
  31. self.assertEqual(a.se, -1)
  32. for s in ['ue=23', 'ue =23', 'ue = 23']:
  33. a = BitStream(s)
  34. self.assertEqual(a.ue, 23)
  35. def testMultipleStringInitialisation(self):
  36. a = BitStream('0b1 , 0x1')
  37. self.assertEqual(a, '0b10001')
  38. a = BitStream('ue=5, ue=1, se=-2')
  39. self.assertEqual(a.read('ue'), 5)
  40. self.assertEqual(a.read('ue'), 1)
  41. self.assertEqual(a.read('se'), -2)
  42. b = BitStream('uint:32 = 12, 0b11') + 'int:100=-100, 0o44'
  43. self.assertEqual(b.read(32).uint, 12)
  44. self.assertEqual(b.read(2).bin, '11')
  45. self.assertEqual(b.read(100).int, -100)
  46. class Reading(unittest.TestCase):
  47. def testReadBits(self):
  48. s = BitStream(bytes=b'\x4d\x55')
  49. self.assertEqual(s.read(4).hex, '4')
  50. self.assertEqual(s.read(8).hex, 'd5')
  51. self.assertEqual(s.read(1), [0])
  52. self.assertEqual(s.read(3).bin, '101')
  53. self.assertFalse(s.read(0))
  54. def testReadByte(self):
  55. s = BitStream(hex='4d55')
  56. self.assertEqual(s.read(8).hex, '4d')
  57. self.assertEqual(s.read(8).hex, '55')
  58. def testReadBytes(self):
  59. s = BitStream(hex='0x112233448811')
  60. self.assertEqual(s.read(3 * 8).hex, '112233')
  61. self.assertRaises(ValueError, s.read, -2 * 8)
  62. s.bitpos += 1
  63. self.assertEqual(s.read(2 * 8).bin, '1000100100010000')
  64. def testReadUE(self):
  65. self.assertRaises(bitstring.InterpretError, BitStream('')._getue)
  66. # The numbers 0 to 8 as unsigned Exponential-Golomb codes
  67. s = BitStream(bin='1 010 011 00100 00101 00110 00111 0001000 0001001')
  68. self.assertEqual(s.pos, 0)
  69. for i in range(9):
  70. self.assertEqual(s.read('ue'), i)
  71. self.assertRaises(bitstring.ReadError, s.read, 'ue')
  72. def testReadSE(self):
  73. s = BitStream(bin='010 00110 0001010 0001000 00111')
  74. self.assertEqual(s.read('se'), 1)
  75. self.assertEqual(s.read('se'), 3)
  76. self.assertEqual(s.readlist(3 * ['se']), [5, 4, -3])
  77. class Find(unittest.TestCase):
  78. def testFind1(self):
  79. s = ConstBitStream(bin='0b0000110110000')
  80. self.assertTrue(s.find(BitStream(bin='11011'), False))
  81. self.assertEqual(s.bitpos, 4)
  82. self.assertEqual(s.read(5).bin, '11011')
  83. s.bitpos = 0
  84. self.assertFalse(s.find('0b11001', False))
  85. def testFind2(self):
  86. s = BitStream(bin='0')
  87. self.assertTrue(s.find(s, False))
  88. self.assertEqual(s.pos, 0)
  89. self.assertFalse(s.find('0b00', False))
  90. self.assertRaises(ValueError, s.find, BitStream(), False)
  91. def testFindWithOffset(self):
  92. s = BitStream(hex='0x112233')[4:]
  93. self.assertTrue(s.find('0x23', False))
  94. self.assertEqual(s.pos, 8)
  95. def testFindCornerCases(self):
  96. s = BitStream(bin='000111000111')
  97. self.assertTrue(s.find('0b000'))
  98. self.assertEqual(s.pos, 0)
  99. self.assertTrue(s.find('0b000'))
  100. self.assertEqual(s.pos, 0)
  101. self.assertTrue(s.find('0b0111000111'))
  102. self.assertEqual(s.pos, 2)
  103. self.assertTrue(s.find('0b000', start=2))
  104. self.assertEqual(s.pos, 6)
  105. self.assertTrue(s.find('0b111', start=6))
  106. self.assertEqual(s.pos, 9)
  107. s.pos += 2
  108. self.assertTrue(s.find('0b1', start=s.pos))
  109. def testFindBytes(self):
  110. s = BitStream('0x010203040102ff')
  111. self.assertFalse(s.find('0x05', bytealigned=True))
  112. self.assertTrue(s.find('0x02', bytealigned=True))
  113. self.assertEqual(s.read(16).hex, '0203')
  114. self.assertTrue(s.find('0x02', start=s.bitpos, bytealigned=True))
  115. s.read(1)
  116. self.assertFalse(s.find('0x02', start=s.bitpos, bytealigned=True))
  117. def testFindBytesAlignedCornerCases(self):
  118. s = BitStream('0xff')
  119. self.assertTrue(s.find(s))
  120. self.assertFalse(s.find(BitStream(hex='0x12')))
  121. self.assertFalse(s.find(BitStream(hex='0xffff')))
  122. def testFindBytesBitpos(self):
  123. s = BitStream(hex='0x1122334455')
  124. s.pos = 2
  125. s.find('0x66', bytealigned=True)
  126. self.assertEqual(s.pos, 2)
  127. s.pos = 38
  128. s.find('0x66', bytealigned=True)
  129. self.assertEqual(s.pos, 38)
  130. def testFindByteAligned(self):
  131. s = BitStream(hex='0x12345678')
  132. self.assertTrue(s.find(BitStream(hex='0x56'), bytealigned=True))
  133. self.assertEqual(s.bytepos, 2)
  134. s.pos = 0
  135. self.assertFalse(s.find(BitStream(hex='0x45'), bytealigned=True))
  136. s = BitStream('0x1234')
  137. s.find('0x1234')
  138. self.assertTrue(s.find('0x1234'))
  139. s += '0b111'
  140. s.pos = 3
  141. s.find('0b1', start=17, bytealigned=True)
  142. self.assertFalse(s.find('0b1', start=17, bytealigned=True))
  143. self.assertEqual(s.pos, 3)
  144. def testFindByteAlignedWithOffset(self):
  145. s = BitStream(hex='0x112233')[4:]
  146. self.assertTrue(s.find(BitStream(hex='0x23')))
  147. def testFindByteAlignedErrors(self):
  148. s = BitStream(hex='0xffff')
  149. self.assertRaises(ValueError, s.find, '')
  150. self.assertRaises(ValueError, s.find, BitStream())
  151. class Rfind(unittest.TestCase):
  152. def testRfind(self):
  153. a = BitStream('0b001001001')
  154. b = a.rfind('0b001')
  155. self.assertEqual(b, (6,))
  156. self.assertEqual(a.pos, 6)
  157. big = BitStream(length=100000) + '0x12' + BitStream(length=10000)
  158. found = big.rfind('0x12', bytealigned=True)
  159. self.assertEqual(found, (100000,))
  160. self.assertEqual(big.pos, 100000)
  161. def testRfindByteAligned(self):
  162. a = BitStream('0x8888')
  163. b = a.rfind('0b1', bytealigned=True)
  164. self.assertEqual(b, (8,))
  165. self.assertEqual(a.pos, 8)
  166. def testRfindStartbit(self):
  167. a = BitStream('0x0000ffffff')
  168. b = a.rfind('0x0000', start=1, bytealigned=True)
  169. self.assertEqual(b, ())
  170. self.assertEqual(a.pos, 0)
  171. b = a.rfind('0x00', start=1, bytealigned=True)
  172. self.assertEqual(b, (8,))
  173. self.assertEqual(a.pos, 8)
  174. def testRfindEndbit(self):
  175. a = BitStream('0x000fff')
  176. b = a.rfind('0b011', bytealigned=False, start=0, end=14)
  177. self.assertEqual(bool(b), True)
  178. b = a.rfind('0b011', False, 0, 13)
  179. self.assertEqual(b, ())
  180. def testRfindErrors(self):
  181. a = BitStream('0x43234234')
  182. self.assertRaises(ValueError, a.rfind, '', bytealigned=True)
  183. self.assertRaises(ValueError, a.rfind, '0b1', start=-99, bytealigned=True)
  184. self.assertRaises(ValueError, a.rfind, '0b1', end=33, bytealigned=True)
  185. self.assertRaises(ValueError, a.rfind, '0b1', start=10, end=9, bytealigned=True)
  186. class Shift(unittest.TestCase):
  187. def testShiftLeft(self):
  188. s = BitStream('0b1010')
  189. t = s << 1
  190. self.assertEqual(s.bin, '1010')
  191. self.assertEqual(t.bin, '0100')
  192. t = t << 0
  193. self.assertEqual(t, '0b0100')
  194. t = t << 100
  195. self.assertEqual(t.bin, '0000')
  196. def testShiftLeftErrors(self):
  197. s = BitStream()
  198. self.assertRaises(ValueError, s.__lshift__, 1)
  199. s = BitStream('0xf')
  200. self.assertRaises(ValueError, s.__lshift__, -1)
  201. def testShiftRight(self):
  202. s = BitStream('0b1010')
  203. t = s >> 1
  204. self.assertEqual(s.bin, '1010')
  205. self.assertEqual(t.bin, '0101')
  206. q = s >> 0
  207. self.assertEqual(q, '0b1010')
  208. q.replace('0b1010', '')
  209. s = s >> 100
  210. self.assertEqual(s.bin, '0000')
  211. def testShiftRightErrors(self):
  212. s = BitStream()
  213. self.assertRaises(ValueError, s.__rshift__, 1)
  214. s = BitStream('0xf')
  215. self.assertRaises(ValueError, s.__rshift__, -1)
  216. def testShiftRightInPlace(self):
  217. s = BitStream('0xffff')[4:12]
  218. s >>= 1
  219. self.assertEqual(s, '0b01111111')
  220. s = BitStream('0b11011')
  221. s >>= 2
  222. self.assertEqual(s.bin, '00110')
  223. s >>= 100000000000000
  224. self.assertEqual(s.bin, '00000')
  225. s = BitStream('0xff')
  226. s >>= 1
  227. self.assertEqual(s, '0x7f')
  228. s >>= 0
  229. self.assertEqual(s, '0x7f')
  230. def testShiftRightInPlaceErrors(self):
  231. s = BitStream()
  232. self.assertRaises(ValueError, s.__irshift__, 1)
  233. s += '0b11'
  234. self.assertRaises(ValueError, s.__irshift__, -1)
  235. def testShiftLeftInPlace(self):
  236. s = BitStream('0xffff')
  237. t = s[4:12]
  238. t <<= 2
  239. self.assertEqual(t, '0b11111100')
  240. s = BitStream('0b11011')
  241. s <<= 2
  242. self.assertEqual(s.bin, '01100')
  243. s <<= 100000000000000000000
  244. self.assertEqual(s.bin, '00000')
  245. s = BitStream('0xff')
  246. s <<= 1
  247. self.assertEqual(s, '0xfe')
  248. s <<= 0
  249. self.assertEqual(s, '0xfe')
  250. def testShiftLeftInPlaceErrors(self):
  251. s = BitStream()
  252. self.assertRaises(ValueError, s.__ilshift__, 1)
  253. s += '0b11'
  254. self.assertRaises(ValueError, s.__ilshift__, -1)
  255. class Replace(unittest.TestCase):
  256. def testReplace1(self):
  257. a = BitStream('0b1')
  258. n = a.replace('0b1', '0b0', bytealigned=True)
  259. self.assertEqual(a.bin, '0')
  260. self.assertEqual(n, 1)
  261. n = a.replace('0b1', '0b0', bytealigned=True)
  262. self.assertEqual(n, 0)
  263. def testReplace2(self):
  264. a = BitStream('0b00001111111')
  265. n = a.replace('0b1', '0b0', bytealigned=True)
  266. self.assertEqual(a.bin, '00001111011')
  267. self.assertEqual(n, 1)
  268. n = a.replace('0b1', '0b0', bytealigned=False)
  269. self.assertEqual(a.bin, '00000000000')
  270. self.assertEqual(n, 6)
  271. def testReplace3(self):
  272. a = BitStream('0b0')
  273. n = a.replace('0b0', '0b110011111', bytealigned=True)
  274. self.assertEqual(n, 1)
  275. self.assertEqual(a.bin, '110011111')
  276. n = a.replace('0b11', '', bytealigned=False)
  277. self.assertEqual(n, 3)
  278. self.assertEqual(a.bin, '001')
  279. def testReplace4(self):
  280. a = BitStream('0x00114723ef4732344700')
  281. n = a.replace('0x47', '0x00', bytealigned=True)
  282. self.assertEqual(n, 3)
  283. self.assertEqual(a.hex, '00110023ef0032340000')
  284. a.replace('0x00', '', bytealigned=True)
  285. self.assertEqual(a.hex, '1123ef3234')
  286. a.replace('0x11', '', start=1, bytealigned=True)
  287. self.assertEqual(a.hex, '1123ef3234')
  288. a.replace('0x11', '0xfff', end=7, bytealigned=True)
  289. self.assertEqual(a.hex, '1123ef3234')
  290. a.replace('0x11', '0xfff', end=8, bytealigned=True)
  291. self.assertEqual(a.hex, 'fff23ef3234')
  292. def testReplace5(self):
  293. a = BitStream('0xab')
  294. b = BitStream('0xcd')
  295. c = BitStream('0xabef')
  296. c.replace(a, b)
  297. self.assertEqual(c, '0xcdef')
  298. self.assertEqual(a, '0xab')
  299. self.assertEqual(b, '0xcd')
  300. a = BitStream('0x0011223344')
  301. a.pos = 12
  302. a.replace('0x11', '0xfff', bytealigned=True)
  303. self.assertEqual(a.pos, 8)
  304. self.assertEqual(a, '0x00fff223344')
  305. def testReplaceWithSelf(self):
  306. a = BitStream('0b11')
  307. a.replace('0b1', a)
  308. self.assertEqual(a, '0xf')
  309. a.replace(a, a)
  310. self.assertEqual(a, '0xf')
  311. def testReplaceCount(self):
  312. a = BitStream('0x223344223344223344')
  313. n = a.replace('0x2', '0x0', count=0, bytealigned=True)
  314. self.assertEqual(n, 0)
  315. self.assertEqual(a.hex, '223344223344223344')
  316. n = a.replace('0x2', '0x0', count=1, bytealigned=True)
  317. self.assertEqual(n, 1)
  318. self.assertEqual(a.hex, '023344223344223344')
  319. n = a.replace('0x33', '', count=2, bytealigned=True)
  320. self.assertEqual(n, 2)
  321. self.assertEqual(a.hex, '02442244223344')
  322. n = a.replace('0x44', '0x4444', count=1435, bytealigned=True)
  323. self.assertEqual(n, 3)
  324. self.assertEqual(a.hex, '02444422444422334444')
  325. def testReplaceBitpos(self):
  326. a = BitStream('0xff')
  327. a.bitpos = 8
  328. a.replace('0xff', '', bytealigned=True)
  329. self.assertEqual(a.bitpos, 0)
  330. a = BitStream('0b0011110001')
  331. a.bitpos = 4
  332. a.replace('0b1', '0b000')
  333. self.assertEqual(a.bitpos, 8)
  334. a = BitStream('0b1')
  335. a.bitpos = 1
  336. a.replace('0b1', '0b11111', bytealigned=True)
  337. self.assertEqual(a.bitpos, 5)
  338. a.replace('0b11', '0b0', False)
  339. self.assertEqual(a.bitpos, 3)
  340. a.append('0b00')
  341. a.replace('0b00', '0xffff')
  342. self.assertEqual(a.bitpos, 17)
  343. def testReplaceErrors(self):
  344. a = BitStream('0o123415')
  345. self.assertRaises(ValueError, a.replace, '', '0o7', bytealigned=True)
  346. self.assertRaises(ValueError, a.replace, '0b1', '0b1', start=-100, bytealigned=True)
  347. self.assertRaises(ValueError, a.replace, '0b1', '0b1', end=19, bytealigned=True)
  348. class SliceAssignment(unittest.TestCase):
  349. # TODO: Move this to another class
  350. def testSetSlice(self):
  351. a = BitStream()
  352. a[0:0] = '0xabcdef'
  353. self.assertEqual(a.bytepos, 3)
  354. a[4:16] = ''
  355. self.assertEqual(a, '0xaef')
  356. self.assertEqual(a.bitpos, 4)
  357. a[8:] = '0x00'
  358. self.assertEqual(a, '0xae00')
  359. self.assertEqual(a.bytepos, 2)
  360. a += '0xf'
  361. a[8:] = '0xe'
  362. self.assertEqual(a, '0xaee')
  363. self.assertEqual(a.bitpos, 12)
  364. b = BitStream()
  365. b[0:800] = '0xffee'
  366. self.assertEqual(b, '0xffee')
  367. b[4:48] = '0xeed123'
  368. self.assertEqual(b, '0xfeed123')
  369. b[-800:8] = '0x0000'
  370. self.assertEqual(b, '0x0000ed123')
  371. a = BitStream('0xabcde')
  372. self.assertEqual(a[-100:-90], '')
  373. self.assertEqual(a[-100:-16], '0xa')
  374. a[-100:-16] = '0x0'
  375. self.assertEqual(a, '0x0bcde')
  376. def testInsertingUsingSetItem(self):
  377. a = BitStream()
  378. a[0:0] = '0xdeadbeef'
  379. self.assertEqual(a, '0xdeadbeef')
  380. self.assertEqual(a.bytepos, 4)
  381. a[16:16] = '0xfeed'
  382. self.assertEqual(a, '0xdeadfeedbeef')
  383. self.assertEqual(a.bytepos, 4)
  384. a[0:0] = '0xa'
  385. self.assertEqual(a, '0xadeadfeedbeef')
  386. self.assertEqual(a.bitpos, 4)
  387. a.bytepos = 6
  388. a[0:0] = '0xff'
  389. self.assertEqual(a.bytepos, 1)
  390. a[8:0] = '0x00000'
  391. self.assertTrue(a.startswith('0xff00000adead'))
  392. def testSliceAssignmentBitPos(self):
  393. a = BitStream('int:64=-1')
  394. a.pos = 64
  395. a[0:8] = ''
  396. self.assertEqual(a.pos, 0)
  397. a.pos = 52
  398. a[48:56] = '0x0000'
  399. self.assertEqual(a.pos, 64)
  400. a[10:10] = '0x0'
  401. self.assertEqual(a.pos, 14)
  402. a[56:68] = '0x000'
  403. self.assertEqual(a.pos, 14)
  404. class Pack(unittest.TestCase):
  405. def testPack1(self):
  406. s = bitstring.pack('uint:6, bin, hex, int:6, se, ue, oct', 10, '0b110', 'ff', -1, -6, 6, '54')
  407. t = BitStream('uint:6=10, 0b110, 0xff, int:6=-1, se=-6, ue=6, oct=54')
  408. self.assertEqual(s, t)
  409. self.assertRaises(bitstring.CreationError, pack, 'tomato', '0')
  410. self.assertRaises(bitstring.CreationError, pack, 'uint', 12)
  411. self.assertRaises(bitstring.CreationError, pack, 'hex', 'penguin')
  412. self.assertRaises(bitstring.CreationError, pack, 'hex12', '0x12')
  413. def testPackWithLiterals(self):
  414. s = bitstring.pack('0xf')
  415. self.assertEqual(s, '0xf')
  416. self.assertTrue(type(s), BitStream)
  417. s = pack('0b1')
  418. self.assertEqual(s, '0b1')
  419. s = pack('0o7')
  420. self.assertEqual(s, '0o7')
  421. s = pack('int:10=-1')
  422. self.assertEqual(s, '0b1111111111')
  423. s = pack('uint:10=1')
  424. self.assertEqual(s, '0b0000000001')
  425. s = pack('ue=12')
  426. self.assertEqual(s.ue, 12)
  427. s = pack('se=-12')
  428. self.assertEqual(s.se, -12)
  429. s = pack('bin=01')
  430. self.assertEqual(s.bin, '01')
  431. s = pack('hex=01')
  432. self.assertEqual(s.hex, '01')
  433. s = pack('oct=01')
  434. self.assertEqual(s.oct, '01')
  435. def testPackWithDict(self):
  436. a = pack('uint:6=width, se=height', height=100, width=12)
  437. w, h = a.unpack('uint:6, se')
  438. self.assertEqual(w, 12)
  439. self.assertEqual(h, 100)
  440. d = {}
  441. d['w'] = '0xf'
  442. d['300'] = 423
  443. d['e'] = '0b1101'
  444. a = pack('int:100=300, bin=e, uint:12=300', **d)
  445. x, y, z = a.unpack('int:100, bin, uint:12')
  446. self.assertEqual(x, 423)
  447. self.assertEqual(y, '1101')
  448. self.assertEqual(z, 423)
  449. def testPackWithDict2(self):
  450. a = pack('int:5, bin:3=b, 0x3, bin=c, se=12', 10, b='0b111', c='0b1')
  451. b = BitStream('int:5=10, 0b111, 0x3, 0b1, se=12')
  452. self.assertEqual(a, b)
  453. a = pack('bits:3=b', b=BitStream('0b101'))
  454. self.assertEqual(a, '0b101')
  455. a = pack('bits:24=b', b=BitStream('0x001122'))
  456. self.assertEqual(a, '0x001122')
  457. def testPackWithDict3(self):
  458. s = pack('hex:4=e, hex:4=0xe, hex:4=e', e='f')
  459. self.assertEqual(s, '0xfef')
  460. s = pack('sep', sep='0b00')
  461. self.assertEqual(s, '0b00')
  462. def testPackWithDict4(self):
  463. s = pack('hello', hello='0xf')
  464. self.assertEqual(s, '0xf')
  465. s = pack('x, y, x, y, x', x='0b10', y='uint:12=100')
  466. t = BitStream('0b10, uint:12=100, 0b10, uint:12=100, 0b10')
  467. self.assertEqual(s, t)
  468. a = [1, 2, 3, 4, 5]
  469. s = pack('int:8, div,' * 5, *a, **{'div': '0b1'})
  470. t = BitStream('int:8=1, 0b1, int:8=2, 0b1, int:8=3, 0b1, int:8=4, 0b1, int:8=5, 0b1')
  471. self.assertEqual(s, t)
  472. def testPackWithLocals(self):
  473. width = 352
  474. height = 288
  475. s = pack('uint:12=width, uint:12=height', **locals())
  476. self.assertEqual(s, '0x160120')
  477. def testPackWithLengthRestriction(self):
  478. s = pack('bin:3', '0b000')
  479. self.assertRaises(bitstring.CreationError, pack, 'bin:3', '0b0011')
  480. self.assertRaises(bitstring.CreationError, pack, 'bin:3', '0b11')
  481. self.assertRaises(bitstring.CreationError, pack, 'bin:3=0b0011')
  482. self.assertRaises(bitstring.CreationError, pack, 'bin:3=0b11')
  483. s = pack('hex:4', '0xf')
  484. self.assertRaises(bitstring.CreationError, pack, 'hex:4', '0b111')
  485. self.assertRaises(bitstring.CreationError, pack, 'hex:4', '0b11111')
  486. self.assertRaises(bitstring.CreationError, pack, 'hex:8=0xf')
  487. s = pack('oct:6', '0o77')
  488. self.assertRaises(bitstring.CreationError, pack, 'oct:6', '0o1')
  489. self.assertRaises(bitstring.CreationError, pack, 'oct:6', '0o111')
  490. self.assertRaises(bitstring.CreationError, pack, 'oct:3', '0b1')
  491. self.assertRaises(bitstring.CreationError, pack, 'oct:3=hello', hello='0o12')
  492. s = pack('bits:3', BitStream('0b111'))
  493. self.assertRaises(bitstring.CreationError, pack, 'bits:3', BitStream('0b11'))
  494. self.assertRaises(bitstring.CreationError, pack, 'bits:3', BitStream('0b1111'))
  495. self.assertRaises(bitstring.CreationError, pack, 'bits:12=b', b=BitStream('0b11'))
  496. def testPackNull(self):
  497. s = pack('')
  498. self.assertFalse(s)
  499. s = pack(',')
  500. self.assertFalse(s)
  501. s = pack(',,,,,0b1,,,,,,,,,,,,,0b1,,,,,,,,,,')
  502. self.assertEqual(s, '0b11')
  503. s = pack(',,uint:12,,bin:3,', 100, '100')
  504. a, b = s.unpack(',,,uint:12,,,,bin:3,,,')
  505. self.assertEqual(a, 100)
  506. self.assertEqual(b, '100')
  507. def testPackDefaultUint(self):
  508. s = pack('10, 5', 1, 2)
  509. a, b = s.unpack('10, 5')
  510. self.assertEqual((a, b), (1, 2))
  511. s = pack('10=150, 12=qee', qee=3)
  512. self.assertEqual(s, 'uint:10=150, uint:12=3')
  513. t = BitStream('100=5')
  514. self.assertEqual(t, 'uint:100=5')
  515. def testPackDefualtUintErrors(self):
  516. self.assertRaises(bitstring.CreationError, BitStream, '5=-1')
  517. def testPackingLongKeywordBitstring(self):
  518. s = pack('bits=b', b=BitStream(128000))
  519. self.assertEqual(s, BitStream(128000))
  520. def testPackingWithListFormat(self):
  521. f = ['bin', 'hex', 'uint:10']
  522. a = pack(','.join(f), '00', '234', 100)
  523. b = pack(f, '00', '234', 100)
  524. self.assertEqual(a, b)
  525. class Unpack(unittest.TestCase):
  526. def testUnpack1(self):
  527. s = BitStream('uint:13=23, hex=e, bin=010, int:41=-554, 0o44332, se=-12, ue=4')
  528. s.pos = 11
  529. a, b, c, d, e, f, g = s.unpack('uint:13, hex:4, bin:3, int:41, oct:15, se, ue')
  530. self.assertEqual(a, 23)
  531. self.assertEqual(b, 'e')
  532. self.assertEqual(c, '010')
  533. self.assertEqual(d, -554)
  534. self.assertEqual(e, '44332')
  535. self.assertEqual(f, -12)
  536. self.assertEqual(g, 4)
  537. self.assertEqual(s.pos, 11)
  538. def testUnpack2(self):
  539. s = BitStream('0xff, 0b000, uint:12=100')
  540. a, b, c = s.unpack('bits:8, bits, uint:12')
  541. self.assertEqual(type(s), BitStream)
  542. self.assertEqual(a, '0xff')
  543. self.assertEqual(type(s), BitStream)
  544. self.assertEqual(b, '0b000')
  545. self.assertEqual(c, 100)
  546. a, b = s.unpack(['bits:11', 'uint'])
  547. self.assertEqual(a, '0xff, 0b000')
  548. self.assertEqual(b, 100)
  549. def testUnpackNull(self):
  550. s = pack('0b1, , , 0xf,')
  551. a, b = s.unpack('bin:1,,,hex:4,')
  552. self.assertEqual(a, '1')
  553. self.assertEqual(b, 'f')
  554. class FromFile(unittest.TestCase):
  555. def testCreationFromFileOperations(self):
  556. s = BitStream(filename='smalltestfile')
  557. s.append('0xff')
  558. self.assertEqual(s.hex, '0123456789abcdefff')
  559. s = ConstBitStream(filename='smalltestfile')
  560. t = BitStream('0xff') + s
  561. self.assertEqual(t.hex, 'ff0123456789abcdef')
  562. s = BitStream(filename='smalltestfile')
  563. del s[:1]
  564. self.assertEqual((BitStream('0b0') + s).hex, '0123456789abcdef')
  565. s = BitStream(filename='smalltestfile')
  566. del s[:7 * 8]
  567. self.assertEqual(s.hex, 'ef')
  568. s = BitStream(filename='smalltestfile')
  569. s.insert('0xc', 4)
  570. self.assertEqual(s.hex, '0c123456789abcdef')
  571. s = BitStream(filename='smalltestfile')
  572. s.prepend('0xf')
  573. self.assertEqual(s.hex, 'f0123456789abcdef')
  574. s = BitStream(filename='smalltestfile')
  575. s.overwrite('0xaaa', 12)
  576. self.assertEqual(s.hex, '012aaa6789abcdef')
  577. s = BitStream(filename='smalltestfile')
  578. s.reverse()
  579. self.assertEqual(s.hex, 'f7b3d591e6a2c480')
  580. s = BitStream(filename='smalltestfile')
  581. del s[-60:]
  582. self.assertEqual(s.hex, '0')
  583. s = BitStream(filename='smalltestfile')
  584. del s[:60]
  585. self.assertEqual(s.hex, 'f')
  586. def testFileProperties(self):
  587. s = ConstBitStream(filename='smalltestfile')
  588. self.assertEqual(s.hex, '0123456789abcdef')
  589. self.assertEqual(s.uint, 81985529216486895)
  590. self.assertEqual(s.int, 81985529216486895)
  591. self.assertEqual(s.bin, '0000000100100011010001010110011110001001101010111100110111101111')
  592. self.assertEqual(s[:-1].oct, '002215053170465363367')
  593. s.bitpos = 0
  594. self.assertEqual(s.read('se'), -72)
  595. s.bitpos = 0
  596. self.assertEqual(s.read('ue'), 144)
  597. self.assertEqual(s.bytes, b'\x01\x23\x45\x67\x89\xab\xcd\xef')
  598. self.assertEqual(s.tobytes(), b'\x01\x23\x45\x67\x89\xab\xcd\xef')
  599. def testCreationFromFileWithLength(self):
  600. s = ConstBitStream(filename='test.m1v', length=32)
  601. self.assertEqual(s.length, 32)
  602. self.assertEqual(s.hex, '000001b3')
  603. s = ConstBitStream(filename='test.m1v', length=0)
  604. self.assertFalse(s)
  605. self.assertRaises(bitstring.CreationError, BitStream, filename='smalltestfile', length=65)
  606. self.assertRaises(bitstring.CreationError, ConstBitStream, filename='smalltestfile', length=64, offset=1)
  607. # self.assertRaises(bitstring.CreationError, ConstBitStream, filename='smalltestfile', offset=65)
  608. f = open('smalltestfile', 'rb')
  609. # self.assertRaises(bitstring.CreationError, ConstBitStream, auto=f, offset=65)
  610. self.assertRaises(bitstring.CreationError, ConstBitStream, auto=f, length=65)
  611. self.assertRaises(bitstring.CreationError, ConstBitStream, auto=f, offset=60, length=5)
  612. def testCreationFromFileWithOffset(self):
  613. a = BitStream(filename='test.m1v', offset=4)
  614. self.assertEqual(a.peek(4 * 8).hex, '00001b31')
  615. b = BitStream(filename='test.m1v', offset=28)
  616. self.assertEqual(b.peek(8).hex, '31')
  617. def testFileSlices(self):
  618. s = BitStream(filename='smalltestfile')
  619. self.assertEqual(s[-16:].hex, 'cdef')
  620. def testCreataionFromFileErrors(self):
  621. self.assertRaises(IOError, BitStream, filename='Idonotexist')
  622. def testFindInFile(self):
  623. s = BitStream(filename='test.m1v')
  624. self.assertTrue(s.find('0x160120'))
  625. self.assertEqual(s.bytepos, 4)
  626. s3 = s.read(3 * 8)
  627. self.assertEqual(s3.hex, '160120')
  628. s.bytepos = 0
  629. self.assertTrue(s._pos == 0)
  630. self.assertTrue(s.find('0x0001b2'))
  631. self.assertEqual(s.bytepos, 13)
  632. def testHexFromFile(self):
  633. s = BitStream(filename='test.m1v')
  634. self.assertEqual(s[0:32].hex, '000001b3')
  635. self.assertEqual(s[-32:].hex, '000001b7')
  636. s.hex = '0x11'
  637. self.assertEqual(s.hex, '11')
  638. def testFileOperations(self):
  639. s1 = BitStream(filename='test.m1v')
  640. s2 = BitStream(filename='test.m1v')
  641. self.assertEqual(s1.read(32).hex, '000001b3')
  642. self.assertEqual(s2.read(32).hex, '000001b3')
  643. s1.bytepos += 4
  644. self.assertEqual(s1.read(8).hex, '02')
  645. self.assertEqual(s2.read(5 * 8).hex, '1601208302')
  646. s1.pos = s1.len
  647. try:
  648. s1.pos += 1
  649. self.assertTrue(False)
  650. except ValueError:
  651. pass
  652. def testFileBitGetting(self):
  653. s = ConstBitStream(filename='smalltestfile', offset=16, length=8) # 0x45
  654. b = s[1]
  655. self.assertTrue(b)
  656. b = s.any(0, [-1, -2, -3])
  657. self.assertTrue(b)
  658. b = s.all(0, [0, 1, 2])
  659. self.assertFalse(b)
  660. def testVeryLargeFiles(self):
  661. # This uses an 11GB file which isn't distributed for obvious reasons
  662. # and so this test won't work for anyone except me!
  663. try:
  664. s = ConstBitStream(filename='11GB.mkv')
  665. except IOError:
  666. return
  667. self.assertEqual(s.len, 11743020505 * 8)
  668. self.assertEqual(s[1000000000:1000000100].hex, 'bdef7335d4545f680d669ce24')
  669. self.assertEqual(s[-4::8].hex, 'bbebf7a1')
  670. class CreationErrors(unittest.TestCase):
  671. def testIncorrectBinAssignment(self):
  672. s = BitStream()
  673. self.assertRaises(bitstring.CreationError, s._setbin_safe, '0010020')
  674. def testIncorrectHexAssignment(self):
  675. s = BitStream()
  676. self.assertRaises(bitstring.CreationError, s._sethex, '0xabcdefg')
  677. class Length(unittest.TestCase):
  678. def testLengthZero(self):
  679. self.assertEqual(BitStream('').len, 0)
  680. def testLength(self):
  681. self.assertEqual(BitStream('0x80').len, 8)
  682. def testLengthErrors(self):
  683. #TODO: Lots of new checks, for various inits which now disallow length and offset
  684. pass
  685. #self.assertRaises(ValueError, BitStream, bin='111', length=-1)
  686. #self.assertRaises(ValueError, BitStream, bin='111', length=4)
  687. def testOffsetLengthError(self):
  688. self.assertRaises(bitstring.CreationError, BitStream, hex='0xffff', offset=-1)
  689. class SimpleConversions(unittest.TestCase):
  690. def testConvertToUint(self):
  691. self.assertEqual(BitStream('0x10').uint, 16)
  692. self.assertEqual(BitStream('0b000111').uint, 7)
  693. def testConvertToInt(self):
  694. self.assertEqual(BitStream('0x10').int, 16)
  695. self.assertEqual(BitStream('0b11110').int, -2)
  696. def testConvertToHex(self):
  697. self.assertEqual(BitStream(bytes=b'\x00\x12\x23\xff').hex, '001223ff')
  698. s = BitStream('0b11111')
  699. self.assertRaises(bitstring.InterpretError, s._gethex)
  700. class Empty(unittest.TestCase):
  701. def testEmptyBitstring(self):
  702. s = BitStream()
  703. self.assertRaises(bitstring.ReadError, s.read, 1)
  704. self.assertEqual(s.bin, '')
  705. self.assertEqual(s.hex, '')
  706. self.assertRaises(bitstring.InterpretError, s._getint)
  707. self.assertRaises(bitstring.InterpretError, s._getuint)
  708. self.assertFalse(s)
  709. def testNonEmptyBitStream(self):
  710. s = BitStream(bin='0')
  711. self.assertFalse(not s.len)
  712. class Position(unittest.TestCase):
  713. def testBitPosition(self):
  714. s = BitStream(bytes=b'\x00\x00\x00')
  715. self.assertEqual(s.bitpos, 0)
  716. s.read(5)
  717. self.assertEqual(s.pos, 5)
  718. s.pos = s.len
  719. self.assertRaises(bitstring.ReadError, s.read, 1)
  720. def testBytePosition(self):
  721. s = BitStream(bytes=b'\x00\x00\x00')
  722. self.assertEqual(s.bytepos, 0)
  723. s.read(10)
  724. self.assertRaises(bitstring.ByteAlignError, s._getbytepos)
  725. s.read(6)
  726. self.assertEqual(s.bytepos, 2)
  727. def testSeekToBit(self):
  728. s = BitStream(bytes=b'\x00\x00\x00\x00\x00\x00')
  729. s.bitpos = 0
  730. self.assertEqual(s.bitpos, 0)
  731. self.assertRaises(ValueError, s._setbitpos, -1)
  732. self.assertRaises(ValueError, s._setbitpos, 6 * 8 + 1)
  733. s.bitpos = 6 * 8
  734. self.assertEqual(s.bitpos, 6 * 8)
  735. def testSeekToByte(self):
  736. s = BitStream(bytes=b'\x00\x00\x00\x00\x00\xab')
  737. s.bytepos = 5
  738. self.assertEqual(s.read(8).hex, 'ab')
  739. def testAdvanceBitsAndBytes(self):
  740. s = BitStream(bytes=b'\x00\x00\x00\x00\x00\x00\x00\x00')
  741. s.pos += 5
  742. self.assertEqual(s.pos, 5)
  743. s.bitpos += 16
  744. self.assertEqual(s.pos, 2 * 8 + 5)
  745. s.pos -= 8
  746. self.assertEqual(s.pos, 8 + 5)
  747. def testRetreatBitsAndBytes(self):
  748. a = BitStream(length=100)
  749. a.pos = 80
  750. a.bytepos -= 5
  751. self.assertEqual(a.bytepos, 5)
  752. a.pos -= 5
  753. self.assertEqual(a.pos, 35)
  754. class Offset(unittest.TestCase):
  755. def testOffset1(self):
  756. s = BitStream(bytes=b'\x00\x1b\x3f', offset=4)
  757. self.assertEqual(s.read(8).bin, '00000001')
  758. self.assertEqual(s.length, 20)
  759. def testOffset2(self):
  760. s1 = BitStream(bytes=b'\xf1\x02\x04')
  761. s2 = BitStream(bytes=b'\xf1\x02\x04', length=23)
  762. for i in [1, 2, 3, 4, 5, 6, 7, 6, 5, 4, 3, 2, 1, 0, 7, 3, 5, 1, 4]:
  763. s1._datastore = offsetcopy(s1._datastore, i)
  764. self.assertEqual(s1.hex, 'f10204')
  765. s2._datastore = offsetcopy(s2._datastore, i)
  766. self.assertEqual(s2.bin, '11110001000000100000010')
  767. class Append(unittest.TestCase):
  768. def testAppend(self):
  769. s1 = BitStream('0b00000')
  770. s1.append(BitStream(bool=True))
  771. self.assertEqual(s1.bin, '000001')
  772. self.assertEqual((BitStream('0x0102') + BitStream('0x0304')).hex, '01020304')
  773. def testAppendSameBitstring(self):
  774. s1 = BitStream('0xf0')[:6]
  775. s1.append(s1)
  776. self.assertEqual(s1.bin, '111100111100')
  777. def testAppendWithOffset(self):
  778. s = BitStream(bytes=b'\x28\x28', offset=1)
  779. s.append('0b0')
  780. self.assertEqual(s.hex, '5050')
  781. class ByteAlign(unittest.TestCase):
  782. def testByteAlign(self):
  783. s = BitStream(hex='0001ff23')
  784. s.bytealign()
  785. self.assertEqual(s.bytepos, 0)
  786. s.pos += 11
  787. s.bytealign()
  788. self.assertEqual(s.bytepos, 2)
  789. s.pos -= 10
  790. s.bytealign()
  791. self.assertEqual(s.bytepos, 1)
  792. def testByteAlignWithOffset(self):
  793. s = BitStream(hex='0112233')
  794. s._datastore = offsetcopy(s._datastore, 3)
  795. bitstoalign = s.bytealign()
  796. self.assertEqual(bitstoalign, 0)
  797. self.assertEqual(s.read(5).bin, '00001')
  798. def testInsertByteAligned(self):
  799. s = BitStream('0x0011')
  800. s.insert(BitStream('0x22'), 8)
  801. self.assertEqual(s.hex, '002211')
  802. s = BitStream(0)
  803. s.insert(BitStream(bin='101'), 0)
  804. self.assertEqual(s.bin, '101')
  805. class Truncate(unittest.TestCase):
  806. def testTruncateStart(self):
  807. s = BitStream('0b1')
  808. del s[:1]
  809. self.assertFalse(s)
  810. s = BitStream(hex='1234')
  811. self.assertEqual(s.hex, '1234')
  812. del s[:4]
  813. self.assertEqual(s.hex, '234')
  814. del s[:9]
  815. self.assertEqual(s.bin, '100')
  816. del s[:2]
  817. self.assertEqual(s.bin, '0')
  818. self.assertEqual(s.len, 1)
  819. del s[:1]
  820. self.assertFalse(s)
  821. def testTruncateEnd(self):
  822. s = BitStream('0b1')
  823. del s[-1:]
  824. self.assertFalse(s)
  825. s = BitStream(bytes=b'\x12\x34')
  826. self.assertEqual(s.hex, '1234')
  827. del s[-4:]
  828. self.assertEqual(s.hex, '123')
  829. del s[-9:]
  830. self.assertEqual(s.bin, '000')
  831. del s[-3:]
  832. self.assertFalse(s)
  833. s = BitStream('0b001')
  834. del s[:2]
  835. del s[-1:]
  836. self.assertFalse(s)
  837. class Slice(unittest.TestCase):
  838. def testByteAlignedSlice(self):
  839. s = BitStream(hex='0x123456')
  840. self.assertEqual(s[8:16].hex, '34')
  841. s = s[8:24]
  842. self.assertEqual(s.len, 16)
  843. self.assertEqual(s.hex, '3456')
  844. s = s[0:8]
  845. self.assertEqual(s.hex, '34')
  846. s.hex = '0x123456'
  847. self.assertEqual(s[8:24][0:8].hex, '34')
  848. def testSlice(self):
  849. s = BitStream(bin='000001111100000')
  850. s1 = s[0:5]
  851. s2 = s[5:10]
  852. s3 = s[10:15]
  853. self.assertEqual(s1.bin, '00000')
  854. self.assertEqual(s2.bin, '11111')
  855. self.assertEqual(s3.bin, '00000')
  856. class Insert(unittest.TestCase):
  857. def testInsert(self):
  858. s1 = BitStream(hex='0x123456')
  859. s2 = BitStream(hex='0xff')
  860. s1.bytepos = 1
  861. s1.insert(s2)
  862. self.assertEqual(s1.bytepos, 2)
  863. self.assertEqual(s1.hex, '12ff3456')
  864. s1.insert('0xee', 24)
  865. self.assertEqual(s1.hex, '12ff34ee56')
  866. self.assertEqual(s1.bitpos, 32)
  867. self.assertRaises(ValueError, s1.insert, '0b1', -1000)
  868. self.assertRaises(ValueError, s1.insert, '0b1', 1000)
  869. def testInsertNull(self):
  870. s = BitStream(hex='0x123').insert(BitStream(), 3)
  871. self.assertEqual(s.hex, '123')
  872. def testInsertBits(self):
  873. one = BitStream(bin='1')
  874. zero = BitStream(bin='0')
  875. s = BitStream(bin='00')
  876. s.insert(one, 0)
  877. self.assertEqual(s.bin, '100')
  878. s.insert(zero, 0)
  879. self.assertEqual(s.bin, '0100')
  880. s.insert(one, s.len)
  881. self.assertEqual(s.bin, '01001')
  882. s.insert(s, 2)
  883. self.assertEqual(s.bin, '0101001001')
  884. class Resetting(unittest.TestCase):
  885. def testSetHex(self):
  886. s = BitStream()
  887. s.hex = '0'
  888. self.assertEqual(s.hex, '0')
  889. s.hex = '0x010203045'
  890. self.assertEqual(s.hex, '010203045')
  891. self.assertRaises(bitstring.CreationError, s._sethex, '0x002g')
  892. def testSetBin(self):
  893. s = BitStream(bin="000101101")
  894. self.assertEqual(s.bin, '000101101')
  895. self.assertEqual(s.len, 9)
  896. s.bin = '0'
  897. self.assertEqual(s.bin, '0')
  898. self.assertEqual(s.len, 1)
  899. def testSetEmptyBin(self):
  900. s = BitStream(hex='0x000001b3')
  901. s.bin = ''
  902. self.assertEqual(s.len, 0)
  903. self.assertEqual(s.bin, '')
  904. def testSetInvalidBin(self):
  905. s = BitStream()
  906. self.assertRaises(bitstring.CreationError, s._setbin_safe, '00102')
  907. class Overwriting(unittest.TestCase):
  908. def testOverwriteBit(self):
  909. s = BitStream(bin='0')
  910. s.overwrite(BitStream(bin='1'), 0)
  911. self.assertEqual(s.bin, '1')
  912. def testOverwriteLimits(self):
  913. s = BitStream(bin='0b11111')
  914. s.overwrite(BitStream(bin='000'), 0)
  915. self.assertEqual(s.bin, '00011')
  916. s.overwrite('0b000', 2)
  917. self.assertEqual(s.bin, '00000')
  918. def testOverwriteNull(self):
  919. s = BitStream(hex='342563fedec')
  920. s2 = BitStream(s)
  921. s.overwrite(BitStream(bin=''), 23)
  922. self.assertEqual(s.bin, s2.bin)
  923. def testOverwritePosition(self):
  924. s1 = BitStream(hex='0123456')
  925. s2 = BitStream(hex='ff')
  926. s1.bytepos = 1
  927. s1.overwrite(s2)
  928. self.assertEqual((s1.hex, s1.bytepos), ('01ff456', 2))
  929. s1.overwrite('0xff', 0)
  930. self.assertEqual((s1.hex, s1.bytepos), ('ffff456', 1))
  931. def testOverwriteWithSelf(self):
  932. s = BitStream('0x123')
  933. s.overwrite(s)
  934. self.assertEqual(s, '0x123')
  935. class Split(unittest.TestCase):
  936. def testSplitByteAlignedCornerCases(self):
  937. s = BitStream()
  938. bsl = s.split(BitStream(hex='0xff'))
  939. self.assertEqual(next(bsl).hex, '')
  940. self.assertRaises(StopIteration, next, bsl)
  941. s = BitStream(hex='aabbcceeddff')
  942. delimiter = BitStream()
  943. bsl = s.split(delimiter)
  944. self.assertRaises(ValueError, next, bsl)
  945. delimiter = BitStream(hex='11')
  946. bsl = s.split(delimiter)
  947. self.assertEqual(next(bsl).hex, s.hex)
  948. def testSplitByteAligned(self):
  949. s = BitStream(hex='0x1234aa1234bbcc1234ffff')
  950. delimiter = BitStream(hex='1234')
  951. bsl = s.split(delimiter)
  952. self.assertEqual([b.hex for b in bsl], ['', '1234aa', '1234bbcc', '1234ffff'])
  953. self.assertEqual(s.pos, 0)
  954. def testSplitByteAlignedWithIntialBytes(self):
  955. s = BitStream(hex='aa471234fedc43 47112233 47 4723 472314')
  956. delimiter = BitStream(hex='47')
  957. s.find(delimiter)
  958. self.assertEqual(s.bytepos, 1)
  959. bsl = s.split(delimiter, start=0)
  960. self.assertEqual([b.hex for b in bsl], ['aa', '471234fedc43', '47112233',
  961. '47', '4723', '472314'])
  962. self.assertEqual(s.bytepos, 1)
  963. def testSplitByteAlignedWithOverlappingDelimiter(self):
  964. s = BitStream(hex='aaffaaffaaffaaffaaff')
  965. bsl = s.split(BitStream(hex='aaffaa'))
  966. self.assertEqual([b.hex for b in bsl], ['', 'aaffaaff', 'aaffaaffaaff'])
  967. class Adding(unittest.TestCase):
  968. def testAdding(self):
  969. s1 = BitStream(hex='0x0102')
  970. s2 = BitStream(hex='0x0304')
  971. s3 = s1 + s2
  972. self.assertEqual(s1.hex, '0102')
  973. self.assertEqual(s2.hex, '0304')
  974. self.assertEqual(s3.hex, '01020304')
  975. s3 += s1
  976. self.assertEqual(s3.hex, '010203040102')
  977. self.assertEqual(s2[9:16].bin, '0000100')
  978. self.assertEqual(s1[0:9].bin, '000000010')
  979. s4 = BitStream(bin='000000010') +\
  980. BitStream(bin='0000100')
  981. self.assertEqual(s4.bin, '0000000100000100')
  982. s2p = s2[9:16]
  983. s1p = s1[0:9]
  984. s5p = s1p + s2p
  985. s5 = s1[0:9] + s2[9:16]
  986. self.assertEqual(s5.bin, '0000000100000100')
  987. def testMoreAdding(self):
  988. s = BitStream(bin='00') + BitStream(bin='') + BitStream(bin='11')
  989. self.assertEqual(s.bin, '0011')
  990. s = '0b01'
  991. s += BitStream('0b11')
  992. self.assertEqual(s.bin, '0111')
  993. s = BitStream('0x00')
  994. t = BitStream('0x11')
  995. s += t
  996. self.assertEqual(s.hex, '0011')
  997. self.assertEqual(t.hex, '11')
  998. s += s
  999. self.assertEqual(s.hex, '00110011')
  1000. def testRadd(self):
  1001. s = '0xff' + BitStream('0xee')
  1002. self.assertEqual(s.hex, 'ffee')
  1003. def testTruncateAsserts(self):
  1004. s = BitStream('0x001122')
  1005. s.bytepos = 2
  1006. del s[-s.len:]
  1007. self.assertEqual(s.bytepos, 0)
  1008. s.append('0x00')
  1009. s.append('0x1122')
  1010. s.bytepos = 2
  1011. del s[:s.len]
  1012. self.assertEqual(s.bytepos, 0)
  1013. s.append('0x00')
  1014. def testOverwriteErrors(self):
  1015. s = BitStream(bin='11111')
  1016. self.assertRaises(ValueError, s.overwrite, BitStream(bin='1'), -10)
  1017. self.assertRaises(ValueError, s.overwrite, BitStream(bin='1'), 6)
  1018. self.assertRaises(ValueError, s.overwrite, BitStream(bin='11111'), 1)
  1019. def testDeleteBits(self):
  1020. s = BitStream(bin='000111100000')
  1021. s.bitpos = 4
  1022. del s[4:8]
  1023. self.assertEqual(s.bin, '00010000')
  1024. del s[4:1004]
  1025. self.assertTrue(s.bin, '0001')
  1026. def testDeleteBitsWithPosition(self):
  1027. s = BitStream(bin='000111100000')
  1028. del s[4:8]
  1029. self.assertEqual(s.bin, '00010000')
  1030. def testDeleteBytes(self):
  1031. s = BitStream('0x00112233')
  1032. del s[8:8]
  1033. self.assertEqual(s.hex, '00112233')
  1034. self.assertEqual(s.pos, 0)
  1035. del s[8:16]
  1036. self.assertEqual(s.hex, '002233')
  1037. self.assertEqual(s.bytepos, 0)
  1038. del s[:24]
  1039. self.assertFalse(s)
  1040. self.assertEqual(s.pos, 0)
  1041. def testGetItemWithPositivePosition(self):
  1042. s = BitStream(bin='0b1011')
  1043. self.assertEqual(s[0], True)
  1044. self.assertEqual(s[1], False)
  1045. self.assertEqual(s[2], True)
  1046. self.assertEqual(s[3], True)
  1047. self.assertRaises(IndexError, s.__getitem__, 4)
  1048. def testGetItemWithNegativePosition(self):
  1049. s = BitStream(bin='1011')
  1050. self.assertEqual(s[-1], True)
  1051. self.assertEqual(s[-2], True)
  1052. self.assertEqual(s[-3], False)
  1053. self.assertEqual(s[-4], True)
  1054. self.assertRaises(IndexError, s.__getitem__, -5)
  1055. def testSlicing(self):
  1056. s = ConstBitStream(hex='0123456789')
  1057. self.assertEqual(s[0:8].hex, '01')
  1058. self.assertFalse(s[0:0])
  1059. self.assertFalse(s[23:20])
  1060. self.assertEqual(s[8:12].bin, '0010')
  1061. self.assertEqual(s[32:80], '0x89')
  1062. def testNegativeSlicing(self):
  1063. s = ConstBitStream(hex='012345678')
  1064. self.assertEqual(s[:-8].hex, '0123456')
  1065. self.assertEqual(s[-16:-8].hex, '56')
  1066. self.assertEqual(s[-24:].hex, '345678')
  1067. self.assertEqual(s[-1000:-24], '0x012')
  1068. def testLen(self):
  1069. s = BitStream()
  1070. self.assertEqual(len(s), 0)
  1071. s.append(BitStream(bin='001'))
  1072. self.assertEqual(len(s), 3)
  1073. def testJoin(self):
  1074. s1 = BitStream(bin='0')
  1075. s2 = BitStream(bin='1')
  1076. s3 = BitStream(bin='000')
  1077. s4 = BitStream(bin='111')
  1078. strings = [s1, s2, s1, s3, s4]
  1079. s = BitStream().join(strings)
  1080. self.assertEqual(s.bin, '010000111')
  1081. def testJoin2(self):
  1082. s1 = BitStream(hex='00112233445566778899aabbccddeeff')
  1083. s2 = BitStream(bin='0b000011')
  1084. bsl = [s1[0:32], s1[4:12], s2, s2, s2, s2]
  1085. s = ConstBitStream().join(bsl)
  1086. self.assertEqual(s.hex, '00112233010c30c3')
  1087. bsl = [BitStream(uint=j, length=12) for j in range(10) for i in range(10)]
  1088. s = BitStream().join(bsl)
  1089. self.assertEqual(s.length, 1200)
  1090. def testPos(self):
  1091. s = BitStream(bin='1')
  1092. self.assertEqual(s.bitpos, 0)
  1093. s.read(1)
  1094. self.assertEqual(s.bitpos, 1)
  1095. def testWritingData(self):
  1096. strings = [BitStream(bin=x) for x in ['0', '001', '0011010010', '010010', '1011']]
  1097. s = BitStream().join(strings)
  1098. s2 = BitStream(bytes=s.bytes)
  1099. self.assertEqual(s2.bin, '000100110100100100101011')
  1100. s2.append(BitStream(bin='1'))
  1101. s3 = BitStream(bytes=s2.tobytes())
  1102. self.assertEqual(s3.bin, '00010011010010010010101110000000')
  1103. def testWritingDataWithOffsets(self):
  1104. s1 = BitStream(bytes=b'\x10')
  1105. s2 = BitStream(bytes=b'\x08\x00', length=8, offset=1)
  1106. s3 = BitStream(bytes=b'\x04\x00', length=8, offset=2)
  1107. self.assertTrue(s1 == s2)
  1108. self.assertTrue(s2 == s3)
  1109. self.assertTrue(s1.bytes == s2.bytes)
  1110. self.assertTrue(s2.bytes == s3.bytes)
  1111. def testVariousThings1(self):
  1112. hexes = ['12345678', '87654321', 'ffffffffff', 'ed', '12ec']
  1113. bins = ['001010', '1101011', '0010000100101110110110', '11', '011']
  1114. bsl = []
  1115. for (hex, bin) in list(zip(hexes, bins)) * 5:
  1116. bsl.append(BitStream(hex=hex))
  1117. bsl.append(BitStream(bin=bin))
  1118. s = BitStream().join(bsl)
  1119. for (hex, bin) in list(zip(hexes, bins)) * 5:
  1120. h = s.read(4 * len(hex))
  1121. b = s.read(len(bin))
  1122. self.assertEqual(h.hex, hex)
  1123. self.assertEqual(b.bin, bin)
  1124. def testVariousThings2(self):
  1125. s1 = BitStream(hex="0x1f08")[:13]
  1126. self.assertEqual(s1.bin, '0001111100001')
  1127. s2 = BitStream(bin='0101')
  1128. self.assertEqual(s2.bin, '0101')
  1129. s1.append(s2)
  1130. self.assertEqual(s1.length, 17)
  1131. self.assertEqual(s1.bin, '00011111000010101')
  1132. s1 = s1[3:8]
  1133. self.assertEqual(s1.bin, '11111')
  1134. def testVariousThings3(self):
  1135. s1 = BitStream(hex='0x012480ff')[2:27]
  1136. s2 = s1 + s1
  1137. self.assertEqual(s2.length, 50)
  1138. s3 = s2[0:25]
  1139. s4 = s2[25:50]
  1140. self.assertEqual(s3.bin, s4.bin)
  1141. def testPeekBit(self):
  1142. s = BitStream(bin='01')
  1143. self.assertEqual(s.peek(1), [0])
  1144. self.assertEqual(s.peek(1), [0])
  1145. self.assertEqual(s.read(1), [0])
  1146. self.assertEqual(s.peek(1), [1])
  1147. self.assertEqual(s.peek(1), [1])
  1148. s = BitStream(bytes=b'\x1f', offset=3)
  1149. self.assertEqual(s.len, 5)
  1150. self.assertEqual(s.peek(5).bin, '11111')
  1151. self.assertEqual(s.peek(5).bin, '11111')
  1152. s.pos += 1
  1153. self.assertRaises(bitstring.ReadError, s.peek, 5)
  1154. s = BitStream(hex='001122334455')
  1155. self.assertEqual(s.peek(8).hex, '00')
  1156. self.assertEqual(s.read(8).hex, '00')
  1157. s.pos += 33
  1158. self.assertRaises(bitstring.ReadError, s.peek, 8)
  1159. s = BitStream(hex='001122334455')
  1160. self.assertEqual(s.peek(8 * 2).hex, '0011')
  1161. self.assertEqual(s.read(8 * 3).hex, '001122')
  1162. self.assertEqual(s.peek(8 * 3).hex, '334455')
  1163. self.assertRaises(bitstring.ReadError, s.peek, 25)
  1164. def testAdvanceBit(self):
  1165. s = BitStream(hex='0xff')
  1166. s.bitpos = 6
  1167. s.pos += 1
  1168. self.assertEqual(s.bitpos, 7)
  1169. s.bitpos += 1
  1170. try:
  1171. s.pos += 1
  1172. self.assertTrue(False)
  1173. except ValueError:
  1174. pass
  1175. def testAdvanceByte(self):
  1176. s = BitStream(hex='0x010203')
  1177. s.bytepos += 1
  1178. self.assertEqual(s.bytepos, 1)
  1179. s.bytepos += 1
  1180. self.assertEqual(s.bytepos, 2)
  1181. s.bytepos += 1
  1182. try:
  1183. s.bytepos += 1
  1184. self.assertTrue(False)
  1185. except ValueError:
  1186. pass
  1187. def testRetreatBit(self):
  1188. s = BitStream(hex='0xff')
  1189. try:
  1190. s.pos -= 1
  1191. self.assertTrue(False)
  1192. except ValueError:
  1193. pass
  1194. s.pos = 5
  1195. s.pos -= 1
  1196. self.assertEqual(s.pos, 4)
  1197. def testRetreatByte(self):
  1198. s = BitStream(hex='0x010203')
  1199. try:
  1200. s.bytepos -= 1
  1201. self.assertTrue(False)
  1202. except ValueError:
  1203. pass
  1204. s.bytepos = 3
  1205. s.bytepos -= 1
  1206. self.assertEqual(s.bytepos, 2)
  1207. self.assertEqual(s.read(8).hex, '03')
  1208. def testCreationByAuto(self):
  1209. s = BitStream('0xff')
  1210. self.assertEqual(s.hex, 'ff')
  1211. s = BitStream('0b00011')
  1212. self.assertEqual(s.bin, '00011')
  1213. self.assertRaises(bitstring.CreationError, BitStream, 'hello')
  1214. s1 = BitStream(bytes=b'\xf5', length=3, offset=5)
  1215. s2 = BitStream(s1, length=1, offset=1)
  1216. self.assertEqual(s2, '0b0')
  1217. s = BitStream(bytes=b'\xff', offset=2)
  1218. t = BitStream(s, offset=2)
  1219. self.assertEqual(t, '0b1111')
  1220. self.assertRaises(TypeError, BitStream, auto=1.2)
  1221. def testCreationByAuto2(self):
  1222. s = BitStream('bin=001')
  1223. self.assertEqual(s.bin, '001')
  1224. s = BitStream('oct=0o007')
  1225. self.assertEqual(s.oct, '007')
  1226. s = BitStream('hex=123abc')
  1227. self.assertEqual(s, '0x123abc')
  1228. s = BitStream('bin:2=01')
  1229. self.assertEqual(s, '0b01')
  1230. for s in ['bin:1=01', 'bits:4=0b1', 'oct:3=000', 'hex:4=0x1234']:
  1231. self.assertRaises(bitstring.CreationError, BitStream, s)
  1232. def testInsertUsingAuto(self):
  1233. s = BitStream('0xff')
  1234. s.insert('0x00', 4)
  1235. self.assertEqual(s.hex, 'f00f')
  1236. self.assertRaises(ValueError, s.insert, 'ff')
  1237. def testOverwriteUsingAuto(self):
  1238. s = BitStream('0x0110')
  1239. s.overwrite('0b1')
  1240. self.assertEqual(s.hex, '8110')
  1241. s.overwrite('')
  1242. self.assertEqual(s.hex, '8110')
  1243. self.assertRaises(ValueError, s.overwrite, '0bf')
  1244. def testFindUsingAuto(self):
  1245. s = BitStream('0b000000010100011000')
  1246. self.assertTrue(s.find('0b101'))
  1247. self.assertEqual(s.pos, 7)
  1248. def testFindbytealignedUsingAuto(self):
  1249. s = BitStream('0x00004700')
  1250. self.assertTrue(s.find('0b01000111', bytealigned=True))
  1251. self.assertEqual(s.bytepos, 2)
  1252. def testAppendUsingAuto(self):
  1253. s = BitStream('0b000')
  1254. s.append('0b111')
  1255. self.assertEqual(s.bin, '000111')
  1256. s.append('0b0')
  1257. self.assertEqual(s.bin, '0001110')
  1258. def testSplitByteAlignedUsingAuto(self):
  1259. s = BitStream('0x000143563200015533000123')
  1260. sections = s.split('0x0001')
  1261. self.assertEqual(next(sections).hex, '')
  1262. self.assertEqual(next(sections).hex, '0001435632')
  1263. self.assertEqual(next(sections).hex, '00015533')
  1264. self.assertEqual(next(sections).hex, '000123')
  1265. self.assertRaises(StopIteration, next, sections)
  1266. def testSplitByteAlignedWithSelf(self):
  1267. s = BitStream('0x1234')
  1268. sections = s.split(s)
  1269. self.assertEqual(next(sections).hex, '')
  1270. self.assertEqual(next(sections).hex, '1234')
  1271. self.assertRaises(StopIteration, next, sections)
  1272. def testPrepend(self):
  1273. s = BitStream('0b000')
  1274. s.prepend('0b11')
  1275. self.assertEqual(s.bin, '11000')
  1276. s.prepend(s)
  1277. self.assertEqual(s.bin, '1100011000')
  1278. s.prepend('')
  1279. self.assertEqual(s.bin, '1100011000')
  1280. def testNullSlice(self):
  1281. s = BitStream('0x111')
  1282. t = s[1:1]
  1283. self.assertEqual(t._datastore.bytelength, 0)
  1284. def testMultipleAutos(self):
  1285. s = BitStream('0xa')
  1286. s.prepend('0xf')
  1287. s.append('0xb')
  1288. self.assertEqual(s, '0xfab')
  1289. s.prepend(s)
  1290. s.append('0x100')
  1291. s.overwrite('0x5', 4)
  1292. self.assertEqual(s, '0xf5bfab100')
  1293. def testReverse(self):
  1294. s = BitStream('0b0011')
  1295. s.reverse()
  1296. self.assertEqual(s.bin, '1100')
  1297. s = BitStream('0b10')
  1298. s.reverse()
  1299. self.assertEqual(s.bin, '01')
  1300. s = BitStream()
  1301. s.reverse()
  1302. self.assertEqual(s.bin, '')
  1303. def testInitWithConcatenatedStrings(self):
  1304. s = BitStream('0xff 0Xee 0xd 0xcc')
  1305. self.assertEqual(s.hex, 'ffeedcc')
  1306. s = BitStream('0b0 0B111 0b001')
  1307. self.assertEqual(s.bin, '0111001')
  1308. s += '0b1' + '0B1'
  1309. self.assertEqual(s.bin, '011100111')
  1310. s = BitStream(hex='ff0xee')
  1311. self.assertEqual(s.hex, 'ffee')
  1312. s = BitStream(bin='000b0b11')
  1313. self.assertEqual(s.bin, '0011')
  1314. s = BitStream(' 0o123 0O 7 0 o1')
  1315. self.assertEqual(s.oct, '12371')
  1316. s += ' 0 o 332'
  1317. self.assertEqual(s.oct, '12371332')
  1318. def testEquals(self):
  1319. s1 = BitStream('0b01010101')
  1320. s2 = BitStream('0b01010101')
  1321. self.assertTrue(s1 == s2)
  1322. s3 = BitStream()
  1323. s4 = BitStream()
  1324. self.assertTrue(s3 == s4)
  1325. self.assertFalse(s3 != s4)
  1326. s5 = BitStream(bytes=b'\xff', offset=2, length=3)
  1327. s6 = BitStream('0b111')
  1328. self.assertTrue(s5 == s6)
  1329. class A(object):
  1330. pass
  1331. self.assertFalse(s5 == A())
  1332. def testLargeEquals(self):
  1333. s1 = BitStream(1000000)
  1334. s2 = BitStream(1000000)
  1335. s1.set(True, [-1, 55, 53214, 534211, 999999])
  1336. s2.set(True, [-1, 55, 53214, 534211, 999999])
  1337. self.assertEqual(s1, s2)
  1338. s1.set(True, 800000)
  1339. self.assertNotEqual(s1, s2)
  1340. def testNotEquals(self):
  1341. s1 = BitStream('0b0')
  1342. s2 = BitStream('0b1')
  1343. self.assertTrue(s1 != s2)
  1344. self.assertFalse(s1 != BitStream('0b0'))
  1345. def testEqualityWithAutoInitialised(self):
  1346. a = BitStream('0b00110111')
  1347. self.assertTrue(a == '0b00110111')
  1348. self.assertTrue(a == '0x37')
  1349. self.assertTrue('0b0011 0111' == a)
  1350. self.assertTrue('0x3 0x7' == a)
  1351. self.assertFalse(a == '0b11001000')
  1352. self.assertFalse('0x3737' == a)
  1353. def testInvertSpecialMethod(self):
  1354. s = BitStream('0b00011001')
  1355. self.assertEqual((~s).bin, '11100110')
  1356. self.assertEqual((~BitStream('0b0')).bin, '1')
  1357. self.assertEqual((~BitStream('0b1')).bin, '0')
  1358. self.assertTrue(~~s == s)
  1359. def testInvertBitPosition(self):
  1360. s = ConstBitStream('0xefef')
  1361. s.pos = 8
  1362. t = ~s
  1363. self.assertEqual(s.pos, 8)
  1364. self.assertEqual(t.pos, 0)
  1365. def testInvertSpecialMethodErrors(self):
  1366. s = BitStream()
  1367. self.assertRaises(bitstring.Error, s.__invert__)
  1368. def testJoinWithAuto(self):
  1369. s = BitStream().join(['0xf', '0b00', BitStream(bin='11')])
  1370. self.assertEqual(s, '0b11110011')
  1371. def testAutoBitStringCopy(self):
  1372. s = BitStream('0xabcdef')
  1373. t = BitStream(s)
  1374. self.assertEqual(t.hex, 'abcdef')
  1375. del s[-8:]
  1376. self.assertEqual(t.hex, 'abcdef')
  1377. class Multiplication(unittest.TestCase):
  1378. def testMultiplication(self):
  1379. a = BitStream('0xff')
  1380. b = a * 8
  1381. self.assertEqual(b, '0xffffffffffffffff')
  1382. b = 4 * a
  1383. self.assertEqual(b, '0xffffffff')
  1384. self.assertTrue(1 * a == a * 1 == a)
  1385. c = a * 0
  1386. self.assertFalse(c)
  1387. a *= 3
  1388. self.assertEqual(a, '0xffffff')
  1389. a *= 0
  1390. self.assertFalse(a)
  1391. one = BitStream('0b1')
  1392. zero = BitStream('0b0')
  1393. mix = one * 2 + 3 * zero + 2 * one * 2
  1394. self.assertEqual(mix, '0b110001111')
  1395. q = BitStream()
  1396. q *= 143
  1397. self.assertFalse(q)
  1398. q += [True, True, False]
  1399. q.pos += 2
  1400. q *= 0
  1401. self.assertFalse(q)
  1402. self.assertEqual(q.bitpos, 0)
  1403. def testMultiplicationWithFiles(self):
  1404. a = BitStream(filename='test.m1v')
  1405. b = a.len
  1406. a *= 3
  1407. self.assertEqual(a.len, 3 * b)
  1408. def testMultiplicationErrors(self):
  1409. a = BitStream('0b1')
  1410. b = BitStream('0b0')
  1411. self.assertRaises(ValueError, a.__mul__, -1)
  1412. self.assertRaises(ValueError, a.__imul__, -1)
  1413. self.assertRaises(ValueError, a.__rmul__, -1)
  1414. self.assertRaises(TypeError, a.__mul__, 1.2)
  1415. self.assertRaises(TypeError, a.__rmul__, b)
  1416. self.assertRaises(TypeError, a.__imul__, b)
  1417. def testFileAndMemEquivalence(self):
  1418. a = ConstBitStream(filename='smalltestfile')
  1419. b = BitStream(filename='smalltestfile')
  1420. self.assertTrue(isinstance(a._datastore._rawarray, bitstring.MmapByteArray))
  1421. self.assertTrue(isinstance(b._datastore._rawarray, bytearray))
  1422. self.assertEqual(a._datastore.getbyte(0), b._datastore.getbyte(0))
  1423. self.assertEqual(a._datastore.getbyteslice(1, 5), bytearray(b._datastore.getbyteslice(1, 5)))
  1424. class BitWise(unittest.TestCase):
  1425. def testBitwiseAnd(self):
  1426. a = BitStream('0b01101')
  1427. b = BitStream('0b00110')
  1428. self.assertEqual((a & b).bin, '00100')
  1429. self.assertEqual((a & '0b11111'), a)
  1430. self.assertRaises(ValueError, a.__and__, '0b1')
  1431. self.assertRaises(ValueError, b.__and__, '0b110111111')
  1432. c = BitStream('0b0011011')
  1433. c.pos = 4
  1434. d = c & '0b1111000'
  1435. self.assertEqual(d.pos, 0)
  1436. self.assertEqual(d.bin, '0011000')
  1437. d = '0b1111000' & c
  1438. self.assertEqual(d.bin, '0011000')
  1439. def testBitwiseOr(self):
  1440. a = BitStream('0b111001001')
  1441. b = BitStream('0b011100011')
  1442. self.assertEqual((a | b).bin, '111101011')
  1443. self.assertEqual((a | '0b000000000'), a)
  1444. self.assertRaises(ValueError, a.__or__, '0b0000')
  1445. self.assertRaises(ValueError, b.__or__, a + '0b1')
  1446. a = '0xff00' | BitStream('0x00f0')
  1447. self.assertEqual(a.hex, 'fff0')
  1448. def testBitwiseXor(self):
  1449. a = BitStream('0b111001001')
  1450. b = BitStream('0b011100011')
  1451. self.assertEqual((a ^ b).bin, '100101010')
  1452. self.assertEqual((a ^ '0b111100000').bin, '000101001')
  1453. self.assertRaises(ValueError, a.__xor__, '0b0000')
  1454. self.assertRaises(ValueError, b.__xor__, a + '0b1')
  1455. a = '0o707' ^ BitStream('0o777')
  1456. self.assertEqual(a.oct, '070')
  1457. class Split(unittest.TestCase):
  1458. def testSplit(self):
  1459. a = BitStream('0b0 010100111 010100 0101 010')
  1460. a.pos = 20
  1461. subs = [i.bin for i in a.split('0b010')]
  1462. self.assertEqual(subs, ['0', '010100111', '010100', '0101', '010'])
  1463. self.assertEqual(a.pos, 20)
  1464. def testSplitCornerCases(self):
  1465. a = BitStream('0b000000')
  1466. bsl = a.split('0b1', False)
  1467. self.assertEqual(next(bsl), a)
  1468. self.assertRaises(StopIteration, next, bsl)
  1469. b = BitStream()
  1470. bsl = b.split('0b001', False)
  1471. self.assertFalse(next(bsl))
  1472. self.assertRaises(StopIteration, next, bsl)
  1473. def testSplitErrors(self):
  1474. a = BitStream('0b0')
  1475. b = a.split('', False)
  1476. self.assertRaises(ValueError, next, b)
  1477. def testSliceWithOffset(self):
  1478. a = BitStream(bytes=b'\x00\xff\x00', offset=7)
  1479. b = a[7:12]
  1480. self.assertEqual(b.bin, '11000')
  1481. def testSplitWithMaxsplit(self):
  1482. a = BitStream('0xaabbccbbccddbbccddee')
  1483. self.assertEqual(len(list(a.split('0xbb', bytealigned=True))), 4)
  1484. bsl = list(a.split('0xbb', count=1, bytealigned=True))
  1485. self.assertEqual((len(bsl), bsl[0]), (1, '0xaa'))
  1486. bsl = list(a.split('0xbb', count=2, bytealigned=True))
  1487. self.assertEqual(len(bsl), 2)
  1488. self.assertEqual(bsl[0], '0xaa')
  1489. self.assertEqual(bsl[1], '0xbbcc')
  1490. def testSplitMore(self):
  1491. s = BitStream('0b1100011001110110')
  1492. for i in range(10):
  1493. a = list(s.split('0b11', False, count=i))
  1494. b = list(s.split('0b11', False))[:i]
  1495. self.assertEqual(a, b)
  1496. b = s.split('0b11', count=-1)
  1497. self.assertRaises(ValueError, next, b)
  1498. def testSplitStartbit(self):
  1499. a = BitStream('0b0010101001000000001111')
  1500. bsl = a.split('0b001', bytealigned=False, start=1)
  1501. self.assertEqual([x.bin for x in bsl], ['010101', '001000000', '001111'])
  1502. b = a.split('0b001', start=-100)
  1503. self.assertRaises(ValueError, next, b)
  1504. b = a.split('0b001', start=23)
  1505. self.assertRaises(ValueError, next, b)
  1506. b = a.split('0b1', start=10, end=9)
  1507. self.assertRaises(ValueError, next, b)
  1508. def testSplitStartbitByteAligned(self):
  1509. a = BitStream('0x00ffffee')
  1510. bsl = list(a.split('0b111', start=9, bytealigned=True))
  1511. self.assertEqual([x.bin for x in bsl], ['1111111', '11111111', '11101110'])
  1512. def testSplitEndbit(self):
  1513. a = BitStream('0b000010001001011')
  1514. bsl = list(a.split('0b1', bytealigned=False, end=14))
  1515. self.assertEqual([x.bin for x in bsl], ['0000', '1000', '100', '10', '1'])
  1516. self.assertEqual(list(a[4:12].split('0b0', False)), list(a.split('0b0', start=4, end=12)))
  1517. # Shouldn't raise ValueError
  1518. bsl = list(a.split('0xffee', end=15))
  1519. # Whereas this one will when we call next()
  1520. bsl = a.split('0xffee', end=16)
  1521. self.assertRaises(ValueError, next, bsl)
  1522. def testSplitEndbitByteAligned(self):
  1523. a = BitStream('0xff00ff')[:22]
  1524. bsl = list(a.split('0b 0000 0000 111', end=19))
  1525. self.assertEqual([x.bin for x in bsl], ['11111111', '00000000111'])
  1526. bsl = list(a.split('0b 0000 0000 111', end=18))
  1527. self.assertEqual([x.bin for x in bsl], ['111111110000000011'])
  1528. def testSplitMaxSplit(self):
  1529. a = BitStream('0b1' * 20)
  1530. for i in range(10):
  1531. bsl = list(a.split('0b1', count=i))
  1532. self.assertEqual(len(bsl), i)
  1533. #######################
  1534. def testPositionInSlice(self):
  1535. a = BitStream('0x00ffff00')
  1536. a.bytepos = 2
  1537. b = a[8:24]
  1538. self.assertEqual(b.bytepos, 0)
  1539. def testFindByteAlignedWithBits(self):
  1540. a = BitStream('0x00112233445566778899')
  1541. a.find('0b0001', bytealigned=True)
  1542. self.assertEqual(a.bitpos, 8)
  1543. def testFindStartbitNotByteAligned(self):
  1544. a = BitStream('0b0010000100')
  1545. found = a.find('0b1', start=4)
  1546. self.assertEqual((found, a.bitpos), ((7,), 7))
  1547. found = a.find('0b1', start=2)
  1548. self.assertEqual((found, a.bitpos), ((2,), 2))
  1549. found = a.find('0b1', bytealigned=False, start=8)
  1550. self.assertEqual((found, a.bitpos), ((), 2))
  1551. def testFindEndbitNotByteAligned(self):
  1552. a = BitStream('0b0010010000')
  1553. found = a.find('0b1', bytealigned=False, end=2)
  1554. self.assertEqual((found, a.bitpos), ((), 0))
  1555. found = a.find('0b1', end=3)
  1556. self.assertEqual((found, a.bitpos), ((2,), 2))
  1557. found = a.find('0b1', bytealigned=False, start=3, end=5)
  1558. self.assertEqual((found, a.bitpos), ((), 2))
  1559. found = a.find('0b1', start=3, end=6)
  1560. self.assertEqual((found[0], a.bitpos), (5, 5))
  1561. def testFindStartbitByteAligned(self):
  1562. a = BitStream('0xff001122ff0011ff')
  1563. a.pos = 40
  1564. found = a.find('0x22', start=23, bytealigned=True)
  1565. self.assertEqual((found, a.bytepos), ((24,), 3))
  1566. a.bytepos = 4
  1567. found = a.find('0x22', start=24, bytealigned=True)
  1568. self.assertEqual((found, a.bytepos), ((24,), 3))
  1569. found = a.find('0x22', start=25, bytealigned=True)
  1570. self.assertEqual((found, a.pos), ((), 24))
  1571. found = a.find('0b111', start=40, bytealigned=True)
  1572. self.assertEqual((found, a.pos), ((56,), 56))
  1573. def testFindEndbitByteAligned(self):
  1574. a = BitStream('0xff001122ff0011ff')
  1575. found = a.find('0x22', end=31, bytealigned=True)
  1576. self.assertFalse(found)
  1577. self.assertEqual(a.pos, 0)
  1578. found = a.find('0x22', end=32, bytealigned=True)
  1579. self.assertTrue(found)
  1580. self.assertEqual(a.pos, 24)
  1581. self.assertEqual(found[0], 24)
  1582. def testFindStartEndbitErrors(self):
  1583. a = BitStream('0b00100')
  1584. self.assertRaises(ValueError, a.find, '0b1', bytealigned=False, start=-100)
  1585. self.assertRaises(ValueError, a.find, '0b1', end=6)
  1586. self.assertRaises(ValueError, a.find, '0b1', start=4, end=3)
  1587. b = BitStream('0x0011223344')
  1588. self.assertRaises(ValueError, a.find, '0x22', bytealigned=True, start=-100)
  1589. self.assertRaises(ValueError, a.find, '0x22', end=41, bytealigned=True)
  1590. def testPrependAndAppendAgain(self):
  1591. c = BitStream('0x1122334455667788')
  1592. c.bitpos = 40
  1593. c.prepend('0b1')
  1594. self.assertEqual(c.bitpos, 41)
  1595. c = BitStream()
  1596. c.prepend('0x1234')
  1597. self.assertEqual(c.bytepos, 2)
  1598. c = BitStream()
  1599. c.append('0x1234')
  1600. self.assertEqual(c.bytepos, 0)
  1601. s = BitStream(bytes=b'\xff\xff', offset=2)
  1602. self.assertEqual(s.length, 14)
  1603. t = BitStream(bytes=b'\x80', offset=1, length=2)
  1604. s.prepend(t)
  1605. self.assertEqual(s, '0x3fff')
  1606. def testFindAll(self):
  1607. a = BitStream('0b11111')
  1608. p = a.findall('0b1')
  1609. self.assertEqual(list(p), [0, 1, 2, 3, 4])
  1610. p = a.findall('0b11')
  1611. self.assertEqual(list(p), [0, 1, 2, 3])
  1612. p = a.findall('0b10')
  1613. self.assertEqual(list(p), [])
  1614. a = BitStream('0x4733eeff66554747335832434547')
  1615. p = a.findall('0x47', bytealigned=True)
  1616. self.assertEqual(list(p), [0, 6 * 8, 7 * 8, 13 * 8])
  1617. p = a.findall('0x4733', bytealigned=True)
  1618. self.assertEqual(list(p), [0, 7 * 8])
  1619. a = BitStream('0b1001001001001001001')
  1620. p = a.findall('0b1001', bytealigned=False)
  1621. self.assertEqual(list(p), [0, 3, 6, 9, 12, 15])
  1622. self.assertEqual(a.pos, 15)
  1623. def testFindAllGenerator(self):
  1624. a = BitStream('0xff1234512345ff1234ff12ff')
  1625. p = a.findall('0xff', bytealigned=True)
  1626. self.assertEqual(next(p), 0)
  1627. self.assertEqual(next(p), 6 * 8)
  1628. self.assertEqual(next(p), 9 * 8)
  1629. self.assertEqual(next(p), 11 * 8)
  1630. self.assertRaises(StopIteration, next, p)
  1631. def testFindAllCount(self):
  1632. s = BitStream('0b1') * 100
  1633. for i in [0, 1, 23]:
  1634. self.assertEqual(len(list(s.findall('0b1', count=i))), i)
  1635. b = s.findall('0b1', bytealigned=True, count=-1)
  1636. self.assertRaises(ValueError, next, b)
  1637. def testContains(self):
  1638. a = BitStream('0b1') + '0x0001dead0001'
  1639. self.assertTrue('0xdead' in a)
  1640. self.assertEqual(a.pos, 0)
  1641. self.assertFalse('0xfeed' in a)
  1642. def testRepr(self):
  1643. max = bitstring.MAX_CHARS
  1644. bls = ['', '0b1', '0o5', '0x43412424f41', '0b00101001010101']
  1645. for bs in bls:
  1646. a = BitStream(bs)
  1647. b = eval(a.__repr__())
  1648. self.assertTrue(a == b)
  1649. for f in [ConstBitStream(filename='test.m1v'),
  1650. ConstBitStream(filename='test.m1v', length=17),
  1651. ConstBitStream(filename='test.m1v', length=23, offset=23102)]:
  1652. f2 = eval(f.__repr__())
  1653. self.assertEqual(f._datastore._rawarray.source.name, f2._datastore._rawarray.source.name)
  1654. self.assertTrue(f2.tobytes() == f.tobytes())
  1655. a = BitStream('0b1')
  1656. self.assertEqual(repr(a), "BitStream('0b1')")
  1657. a += '0b11'
  1658. self.assertEqual(repr(a), "BitStream('0b111')")
  1659. a += '0b1'
  1660. self.assertEqual(repr(a), "BitStream('0xf')")
  1661. a *= max
  1662. self.assertEqual(repr(a), "BitStream('0x" + "f" * max + "')")
  1663. a += '0xf'
  1664. self.assertEqual(repr(a), "BitStream('0x" + "f" * max + "...') # length=%d" % (max * 4 + 4))
  1665. def testPrint(self):
  1666. s = BitStream(hex='0x00')
  1667. self.assertEqual('0x' + s.hex, s.__str__())
  1668. s = BitStream(filename='test.m1v')
  1669. self.assertEqual('0x' + s[0:bitstring.MAX_CHARS * 4].hex + '...', s.__str__())
  1670. self.assertEqual(BitStream().__str__(), '')
  1671. s = BitStream('0b11010')
  1672. self.assertEqual('0b' + s.bin, s.__str__())
  1673. s = BitStream('0x12345678901234567890,0b1')
  1674. self.assertEqual('0x12345678901234567890, 0b1', s.__str__())
  1675. def testIter(self):
  1676. a = BitStream('0b001010')
  1677. b = BitStream()
  1678. for bit in a:
  1679. b.append(ConstBitStream(bool=bit))
  1680. self.assertEqual(a, b)
  1681. def testDelitem(self):
  1682. a = BitStream('0xffee')
  1683. del a[0:8]
  1684. self.assertEqual(a.hex, 'ee')
  1685. del a[0:8]
  1686. self.assertFalse(a)
  1687. del a[10:12]
  1688. self.assertFalse(a)
  1689. def testNonZeroBitsAtStart(self):
  1690. a = BitStream(bytes=b'\xff', offset=2)
  1691. b = BitStream('0b00')
  1692. b += a
  1693. self.assertTrue(b == '0b0011 1111')
  1694. #self.assertEqual(a._datastore.rawbytes, b'\xff')
  1695. self.assertEqual(a.tobytes(), b'\xfc')
  1696. def testNonZeroBitsAtEnd(self):
  1697. a = BitStream(bytes=b'\xff', length=5)
  1698. #self.assertEqual(a._datastore.rawbytes, b'\xff')
  1699. b = BitStream('0b00')
  1700. a += b
  1701. self.assertTrue(a == '0b1111100')
  1702. self.assertEqual(a.tobytes(), b'\xf8')
  1703. self.assertRaises(ValueError, a._getbytes)
  1704. def testNewOffsetErrors(self):
  1705. self.assertRaises(bitstring.CreationError, BitStream, hex='ff', offset=-1)
  1706. self.assertRaises(bitstring.CreationError, BitStream, '0xffffffff', offset=33)
  1707. def testSliceStep(self):
  1708. a = BitStream('0x3')
  1709. b = a[::1]
  1710. self.assertEqual(a, b)
  1711. self.assertEqual(a[2:4:1], '0b11')
  1712. self.assertEqual(a[0:2:1], '0b00')
  1713. self.assertEqual(a[:3], '0o1')
  1714. a = BitStream('0x0011223344556677')
  1715. self.assertEqual(a[-8:], '0x77')
  1716. self.assertEqual(a[:-24], '0x0011223344')
  1717. self.assertEqual(a[-1000:-24], '0x0011223344')
  1718. def testInterestingSliceStep(self):
  1719. a = BitStream('0b0011000111')
  1720. self.assertEqual(a[7:3:-1], '0b1000')
  1721. self.assertEqual(a[9:2:-1], '0b1110001')
  1722. self.assertEqual(a[8:2:-2], '0b100')
  1723. self.assertEqual(a[100:-20:-3], '0b1010')
  1724. self.assertEqual(a[100:-20:-1], '0b1110001100')
  1725. self.assertEqual(a[10:2:-1], '0b1110001')
  1726. self.assertEqual(a[100:2:-1], '0b1110001')
  1727. def testInsertionOrderAndBitpos(self):
  1728. b = BitStream()
  1729. b[0:0] = '0b0'
  1730. b[0:0] = '0b1'
  1731. self.assertEqual(b, '0b10')
  1732. self.assertEqual(b.bitpos, 1)
  1733. a = BitStream()
  1734. a.insert('0b0')
  1735. a.insert('0b1')
  1736. self.assertEqual(a, '0b01')
  1737. self.assertEqual(a.bitpos, 2)
  1738. def testOverwriteOrderAndBitpos(self):
  1739. a = BitStream('0xff')
  1740. a.overwrite('0xa')
  1741. self.assertEqual(a, '0xaf')
  1742. self.assertEqual(a.bitpos, 4)
  1743. a.overwrite('0xb')
  1744. self.assertEqual(a, '0xab')
  1745. self.assertEqual(a.bitpos, 8)
  1746. self.assertRaises(ValueError, a.overwrite, '0b1')
  1747. a.overwrite('0xa', 4)
  1748. self.assertEqual(a, '0xaa')
  1749. self.assertEqual(a.bitpos, 8)
  1750. a.overwrite(a, 0)
  1751. self.assertEqual(a, '0xaa')
  1752. def testInitSliceWithInt(self):
  1753. a = BitStream(length=8)
  1754. a[:] = 100
  1755. self.assertEqual(a.uint, 100)
  1756. a[0] = 1
  1757. self.assertEqual(a.bin, '11100100')
  1758. a[1] = 0
  1759. self.assertEqual(a.bin, '10100100')
  1760. a[-1] = -1
  1761. self.assertEqual(a.bin, '10100101')
  1762. a[-3:] = -2
  1763. self.assertEqual(a.bin, '10100110')
  1764. def testInitSliceWithIntErrors(self):
  1765. a = BitStream('0b0000')
  1766. self.assertRaises(ValueError, a.__setitem__, slice(0, 4), 16)
  1767. self.assertRaises(ValueError, a.__setitem__, slice(0, 4), -9)
  1768. self.assertRaises(ValueError, a.__setitem__, 0, 2)
  1769. self.assertRaises(ValueError, a.__setitem__, 0, -2)
  1770. def testReverseWithSlice(self):
  1771. a = BitStream('0x0012ff')
  1772. a.reverse()
  1773. self.assertEqual(a, '0xff4800')
  1774. a.reverse(8, 16)
  1775. self.assertEqual(a, '0xff1200')
  1776. b = a[8:16]
  1777. b.reverse()
  1778. a[8:16] = b
  1779. self.assertEqual(a, '0xff4800')
  1780. def testReverseWithSliceErrors(self):
  1781. a = BitStream('0x123')
  1782. self.assertRaises(ValueError, a.reverse, -1, 4)
  1783. self.assertRaises(ValueError, a.reverse, 10, 9)
  1784. self.assertRaises(ValueError, a.reverse, 1, 10000)
  1785. def testInitialiseFromList(self):
  1786. a = BitStream([])
  1787. self.assertFalse(a)
  1788. a = BitStream([True, False, [], [0], 'hello'])
  1789. self.assertEqual(a, '0b10011')
  1790. a += []
  1791. self.assertEqual(a, '0b10011')
  1792. a += [True, False, True]
  1793. self.assertEqual(a, '0b10011101')
  1794. a.find([12, 23])
  1795. self.assertEqual(a.pos, 3)
  1796. self.assertEqual([1, 0, False, True], BitStream('0b1001'))
  1797. a = [True] + BitStream('0b1')
  1798. self.assertEqual(a, '0b11')
  1799. def testInitialiseFromTuple(self):
  1800. a = BitStream(())
  1801. self.assertFalse(a)
  1802. a = BitStream((0, 1, '0', '1'))
  1803. self.assertEqual('0b0111', a)
  1804. a.replace((True, True), [])
  1805. self.assertEqual(a, (False, True))
  1806. def testCut(self):
  1807. a = BitStream('0x00112233445')
  1808. b = list(a.cut(8))
  1809. self.assertEqual(b, ['0x00', '0x11', '0x22', '0x33', '0x44'])
  1810. b = list(a.cut(4, 8, 16))
  1811. self.assertEqual(b, ['0x1', '0x1'])
  1812. b = list(a.cut(4, 0, 44, 4))
  1813. self.assertEqual(b, ['0x0', '0x0', '0x1', '0x1'])
  1814. a = BitStream()
  1815. b = list(a.cut(10))
  1816. self.assertTrue(not b)
  1817. def testCutErrors(self):
  1818. a = BitStream('0b1')
  1819. b = a.cut(1, 1, 2)
  1820. self.assertRaises(ValueError, next, b)
  1821. b = a.cut(1, -2, 1)
  1822. self.assertRaises(ValueError, next, b)
  1823. b = a.cut(0)
  1824. self.assertRaises(ValueError, next, b)
  1825. b = a.cut(1, count=-1)
  1826. self.assertRaises(ValueError, next, b)
  1827. def testCutProblem(self):
  1828. s = BitStream('0x1234')
  1829. for n in list(s.cut(4)):
  1830. s.prepend(n)
  1831. self.assertEqual(s, '0x43211234')
  1832. def testJoinFunctions(self):
  1833. a = BitStream().join(['0xa', '0xb', '0b1111'])
  1834. self.assertEqual(a, '0xabf')
  1835. a = BitStream('0b1').join(['0b0' for i in range(10)])
  1836. self.assertEqual(a, '0b0101010101010101010')
  1837. a = BitStream('0xff').join([])
  1838. self.assertFalse(a)
  1839. def testAddingBitpos(self):
  1840. a = BitStream('0xff')
  1841. b = BitStream('0x00')
  1842. a.bitpos = b.bitpos = 8
  1843. c = a + b
  1844. self.assertEqual(c.bitpos, 0)
  1845. def testIntelligentRead1(self):
  1846. a = BitStream(uint=123, length=23)
  1847. u = a.read('uint:23')
  1848. self.assertEqual(u, 123)
  1849. self.assertEqual(a.pos, a.len)
  1850. b = BitStream(int=-12, length=44)
  1851. i = b.read('int:44')
  1852. self.assertEqual(i, -12)
  1853. self.assertEqual(b.pos, b.len)
  1854. u2, i2 = (a + b).readlist('uint:23, int:44')
  1855. self.assertEqual((u2, i2), (123, -12))
  1856. def testIntelligentRead2(self):
  1857. a = BitStream(ue=822)
  1858. u = a.read('ue')
  1859. self.assertEqual(u, 822)
  1860. self.assertEqual(a.pos, a.len)
  1861. b = BitStream(se=-1001)
  1862. s = b.read('se')
  1863. self.assertEqual(s, -1001)
  1864. self.assertEqual(b.pos, b.len)
  1865. s, u1, u2 = (b + 2 * a).readlist('se, ue, ue')
  1866. self.assertEqual((s, u1, u2), (-1001, 822, 822))
  1867. def testIntelligentRead3(self):
  1868. a = BitStream('0x123') + '0b11101'
  1869. h = a.read('hex:12')
  1870. self.assertEqual(h, '123')
  1871. b = a.read('bin: 5')
  1872. self.assertEqual(b, '11101')
  1873. c = '0b' + b + a
  1874. b, h = c.readlist('bin:5, hex:12')
  1875. self.assertEqual((b, h), ('11101', '123'))
  1876. def testIntelligentRead4(self):
  1877. a = BitStream('0o007')
  1878. o = a.read('oct:9')
  1879. self.assertEqual(o, '007')
  1880. self.assertEqual(a.pos, a.len)
  1881. def testIntelligentRead5(self):
  1882. a = BitStream('0x00112233')
  1883. c0, c1, c2 = a.readlist('bits:8, bits:8, bits:16')
  1884. self.assertEqual((c0, c1, c2), (BitStream('0x00'), BitStream('0x11'), BitStream('0x2233')))
  1885. a.pos = 0
  1886. c = a.read('bits:16')
  1887. self.assertEqual(c, BitStream('0x0011'))
  1888. def testIntelligentRead6(self):
  1889. a = BitStream('0b000111000')
  1890. b1, b2, b3 = a.readlist('bin :3, int: 3, int:3')
  1891. self.assertEqual(b1, '000')
  1892. self.assertEqual(b2, -1)
  1893. self.assertEqual(b3, 0)
  1894. def testIntelligentRead7(self):
  1895. a = BitStream('0x1234')
  1896. a1, a2, a3, a4 = a.readlist('bin:0, oct:0, hex:0, bits:0')
  1897. self.assertTrue(a1 == a2 == a3 == '')
  1898. self.assertFalse(a4)
  1899. self.assertRaises(ValueError, a.read, 'int:0')
  1900. self.assertRaises(ValueError, a.read, 'uint:0')
  1901. self.assertEqual(a.pos, 0)
  1902. def testIntelligentRead8(self):
  1903. a = BitStream('0x123456')
  1904. for t in ['hex:1', 'oct:1', 'hex4', '-5', 'fred', 'bin:-2',
  1905. 'uint:p', 'uint:-2', 'int:u', 'int:-3', 'ses', 'uee', '-14']:
  1906. self.assertRaises(ValueError, a.read, t)
  1907. def testIntelligentRead9(self):
  1908. a = BitStream('0xff')
  1909. self.assertEqual(a.read('intle'), -1)
  1910. def testFillerReads1(self):
  1911. s = BitStream('0x012345')
  1912. t = s.read('bits')
  1913. self.assertEqual(s, t)
  1914. s.pos = 0
  1915. a, b = s.readlist('hex:8, hex')
  1916. self.assertEqual(a, '01')
  1917. self.assertEqual(b, '2345')
  1918. self.assertTrue(isinstance(b, str))
  1919. s.bytepos = 0
  1920. a, b = s.readlist('bin, hex:20')
  1921. self.assertEqual(a, '0000')
  1922. self.assertEqual(b, '12345')
  1923. self.assertTrue(isinstance(a, str))
  1924. def testFillerReads2(self):
  1925. s = BitStream('0xabcdef')
  1926. self.assertRaises(bitstring.Error, s.readlist, 'bits, se')
  1927. self.assertRaises(bitstring.Error, s.readlist, 'hex:4, bits, ue, bin:4')
  1928. s.pos = 0
  1929. self.assertRaises(bitstring.Error, s.readlist, 'bin, bin')
  1930. def testIntelligentPeek(self):
  1931. a = BitStream('0b01, 0x43, 0o4, uint:23=2, se=5, ue=3')
  1932. b, c, e = a.peeklist('bin:2, hex:8, oct:3')
  1933. self.assertEqual((b, c, e), ('01', '43', '4'))
  1934. self.assertEqual(a.pos, 0)
  1935. a.pos = 13
  1936. f, g, h = a.peeklist('uint:23, se, ue')
  1937. self.assertEqual((f, g, h), (2, 5, 3))
  1938. self.assertEqual(a.pos, 13)
  1939. def testReadMultipleBits(self):
  1940. s = BitStream('0x123456789abcdef')
  1941. a, b = s.readlist([4, 4])
  1942. self.assertEqual(a, '0x1')
  1943. self.assertEqual(b, '0x2')
  1944. c, d, e = s.readlist([8, 16, 8])
  1945. self.assertEqual(c, '0x34')
  1946. self.assertEqual(d, '0x5678')
  1947. self.assertEqual(e, '0x9a')
  1948. def testPeekMultipleBits(self):
  1949. s = BitStream('0b1101, 0o721, 0x2234567')
  1950. a, b, c, d = s.peeklist([2, 1, 1, 9])
  1951. self.assertEqual(a, '0b11')
  1952. self.assertEqual(bool(b), False)
  1953. self.assertEqual(bool(c), True)
  1954. self.assertEqual(d, '0o721')
  1955. self.assertEqual(s.pos, 0)
  1956. a, b = s.peeklist([4, 9])
  1957. self.assertEqual(a, '0b1101')
  1958. self.assertEqual(b, '0o721')
  1959. s.pos = 13
  1960. a, b = s.peeklist([16, 8])
  1961. self.assertEqual(a, '0x2234')
  1962. self.assertEqual(b, '0x56')
  1963. self.assertEqual(s.pos, 13)
  1964. def testDifficultPrepends(self):
  1965. a = BitStream('0b1101011')
  1966. b = BitStream()
  1967. for i in range(10):
  1968. b.prepend(a)
  1969. self.assertEqual(b, a * 10)
  1970. def testPackingWrongNumberOfThings(self):
  1971. self.assertRaises(bitstring.CreationError, pack, 'bin:1')
  1972. self.assertRaises(bitstring.CreationError, pack, '', 100)
  1973. def testPackWithVariousKeys(self):
  1974. a = pack('uint10', uint10='0b1')
  1975. self.assertEqual(a, '0b1')
  1976. b = pack('0b110', **{'0b110': '0xfff'})
  1977. self.assertEqual(b, '0xfff')
  1978. def testPackWithVariableLength(self):
  1979. for i in range(1, 11):
  1980. a = pack('uint:n', 0, n=i)
  1981. self.assertEqual(a.bin, '0' * i)
  1982. def testToBytes(self):
  1983. a = BitStream(bytes=b'\xab\x00')
  1984. b = a.tobytes()
  1985. self.assertEqual(a.bytes, b)
  1986. for i in range(7):
  1987. del a[-1:]
  1988. self.assertEqual(a.tobytes(), b'\xab\x00')
  1989. del a[-1:]
  1990. self.assertEqual(a.tobytes(), b'\xab')
  1991. def testToFile(self):
  1992. a = BitStream('0x0000ff')[:17]
  1993. f = open('temp_bitstring_unit_testing_file', 'wb')
  1994. a.tofile(f)
  1995. f.close()
  1996. b = BitStream(filename='temp_bitstring_unit_testing_file')
  1997. self.assertEqual(b, '0x000080')
  1998. a = BitStream('0x911111')
  1999. del a[:1]
  2000. self.assertEqual(a + '0b0', '0x222222')
  2001. f = open('temp_bitstring_unit_testing_file', 'wb')
  2002. a.tofile(f)
  2003. f.close()
  2004. b = BitStream(filename='temp_bitstring_unit_testing_file')
  2005. self.assertEqual(b, '0x222222')
  2006. os.remove('temp_bitstring_unit_testing_file')
  2007. #def testToFileWithLargerFile(self):
  2008. # a = BitStream(length=16000000)
  2009. # a[1] = '0b1'
  2010. # a[-2] = '0b1'
  2011. # f = open('temp_bitstring_unit_testing_file' ,'wb')
  2012. # a.tofile(f)
  2013. # f.close()
  2014. # b = BitStream(filename='temp_bitstring_unit_testing_file')
  2015. # self.assertEqual(b.len, 16000000)
  2016. # self.assertEqual(b[1], True)
  2017. #
  2018. # f = open('temp_bitstring_unit_testing_file' ,'wb')
  2019. # a[1:].tofile(f)
  2020. # f.close()
  2021. # b = BitStream(filename='temp_bitstring_unit_testing_file')
  2022. # self.assertEqual(b.len, 16000000)
  2023. # self.assertEqual(b[0], True)
  2024. # os.remove('temp_bitstring_unit_testing_file')
  2025. def testTokenParser(self):
  2026. tp = bitstring.tokenparser
  2027. self.assertEqual(tp('hex'), (True, [('hex', None, None)]))
  2028. self.assertEqual(tp('hex=14'), (True, [('hex', None, '14')]))
  2029. self.assertEqual(tp('se'), (False, [('se', None, None)]))
  2030. self.assertEqual(tp('ue=12'), (False, [('ue', None, '12')]))
  2031. self.assertEqual(tp('0xef'), (False, [('0x', None, 'ef')]))
  2032. self.assertEqual(tp('uint:12'), (False, [('uint', 12, None)]))
  2033. self.assertEqual(tp('int:30=-1'), (False, [('int', 30, '-1')]))
  2034. self.assertEqual(tp('bits:10'), (False, [('bits', 10, None)]))
  2035. self.assertEqual(tp('bits:10'), (False, [('bits', 10, None)]))
  2036. self.assertEqual(tp('123'), (False, [('uint', 123, None)]))
  2037. self.assertEqual(tp('123'), (False, [('uint', 123, None)]))
  2038. self.assertRaises(ValueError, tp, 'hex12')
  2039. self.assertEqual(tp('hex12', ('hex12',)), (False, [('hex12', None, None)]))
  2040. self.assertEqual(tp('2*bits:6'), (False, [('bits', 6, None), ('bits', 6, None)]))
  2041. def testAutoFromFileObject(self):
  2042. with open('test.m1v', 'rb') as f:
  2043. s = ConstBitStream(f, offset=32, length=12)
  2044. self.assertEqual(s.uint, 352)
  2045. t = ConstBitStream('0xf') + f
  2046. self.assertTrue(t.startswith('0xf000001b3160'))
  2047. s2 = ConstBitStream(f)
  2048. t2 = BitStream('0xc')
  2049. t2.prepend(s2)
  2050. self.assertTrue(t2.startswith('0x000001b3'))
  2051. self.assertTrue(t2.endswith('0xc'))
  2052. with open('test.m1v', 'rb') as b:
  2053. u = BitStream(bytes=b.read())
  2054. # TODO: u == s2 is much slower than u.bytes == s2.bytes
  2055. self.assertEqual(u.bytes, s2.bytes)
  2056. def testFileBasedCopy(self):
  2057. with open('smalltestfile', 'rb') as f:
  2058. s = BitStream(f)
  2059. t = BitStream(s)
  2060. s.prepend('0b1')
  2061. self.assertEqual(s[1:], t)
  2062. s = BitStream(f)
  2063. t = copy.copy(s)
  2064. t.append('0b1')
  2065. self.assertEqual(s, t[:-1])
  2066. def testBigEndianSynonyms(self):
  2067. s = BitStream('0x12318276ef')
  2068. self.assertEqual(s.int, s.intbe)
  2069. self.assertEqual(s.uint, s.uintbe)
  2070. s = BitStream(intbe=-100, length=16)
  2071. self.assertEqual(s, 'int:16=-100')
  2072. s = BitStream(uintbe=13, length=24)
  2073. self.assertEqual(s, 'int:24=13')
  2074. s = BitStream('uintbe:32=1000')
  2075. self.assertEqual(s, 'uint:32=1000')
  2076. s = BitStream('intbe:8=2')
  2077. self.assertEqual(s, 'int:8=2')
  2078. self.assertEqual(s.read('intbe'), 2)
  2079. s.pos = 0
  2080. self.assertEqual(s.read('uintbe'), 2)
  2081. def testBigEndianSynonymErrors(self):
  2082. self.assertRaises(bitstring.CreationError, BitStream, uintbe=100, length=15)
  2083. self.assertRaises(bitstring.CreationError, BitStream, intbe=100, length=15)
  2084. self.assertRaises(bitstring.CreationError, BitStream, 'uintbe:17=100')
  2085. self.assertRaises(bitstring.CreationError, BitStream, 'intbe:7=2')
  2086. s = BitStream('0b1')
  2087. self.assertRaises(bitstring.InterpretError, s._getintbe)
  2088. self.assertRaises(bitstring.InterpretError, s._getuintbe)
  2089. self.assertRaises(ValueError, s.read, 'uintbe')
  2090. self.assertRaises(ValueError, s.read, 'intbe')
  2091. def testLittleEndianUint(self):
  2092. s = BitStream(uint=100, length=16)
  2093. self.assertEqual(s.uintle, 25600)
  2094. s = BitStream(uintle=100, length=16)
  2095. self.assertEqual(s.uint, 25600)
  2096. self.assertEqual(s.uintle, 100)
  2097. s.uintle += 5
  2098. self.assertEqual(s.uintle, 105)
  2099. s = BitStream('uintle:32=999')
  2100. self.assertEqual(s.uintle, 999)
  2101. s.byteswap()
  2102. self.assertEqual(s.uint, 999)
  2103. s = pack('uintle:24', 1001)
  2104. self.assertEqual(s.uintle, 1001)
  2105. self.assertEqual(s.length, 24)
  2106. self.assertEqual(s.read('uintle'), 1001)
  2107. def testLittleEndianInt(self):
  2108. s = BitStream(int=100, length=16)
  2109. self.assertEqual(s.intle, 25600)
  2110. s = BitStream(intle=100, length=16)
  2111. self.assertEqual(s.int, 25600)
  2112. self.assertEqual(s.intle, 100)
  2113. s.intle += 5
  2114. self.assertEqual(s.intle, 105)
  2115. s = BitStream('intle:32=999')
  2116. self.assertEqual(s.intle, 999)
  2117. s.byteswap()
  2118. self.assertEqual(s.int, 999)
  2119. s = pack('intle:24', 1001)
  2120. self.assertEqual(s.intle, 1001)
  2121. self.assertEqual(s.length, 24)
  2122. self.assertEqual(s.read('intle'), 1001)
  2123. def testLittleEndianErrors(self):
  2124. self.assertRaises(bitstring.CreationError, BitStream, 'uintle:15=10')
  2125. self.assertRaises(bitstring.CreationError, BitStream, 'intle:31=-999')
  2126. self.assertRaises(bitstring.CreationError, BitStream, uintle=100, length=15)
  2127. self.assertRaises(bitstring.CreationError, BitStream, intle=100, length=15)
  2128. s = BitStream('0xfff')
  2129. self.assertRaises(bitstring.InterpretError, s._getintle)
  2130. self.assertRaises(bitstring.InterpretError, s._getuintle)
  2131. self.assertRaises(ValueError, s.read, 'uintle')
  2132. self.assertRaises(ValueError, s.read, 'intle')
  2133. def testStructTokens1(self):
  2134. self.assertEqual(pack('<b', 23), BitStream('intle:8=23'))
  2135. self.assertEqual(pack('<B', 23), BitStream('uintle:8=23'))
  2136. self.assertEqual(pack('<h', 23), BitStream('intle:16=23'))
  2137. self.assertEqual(pack('<H', 23), BitStream('uintle:16=23'))
  2138. self.assertEqual(pack('<l', 23), BitStream('intle:32=23'))
  2139. self.assertEqual(pack('<L', 23), BitStream('uintle:32=23'))
  2140. self.assertEqual(pack('<q', 23), BitStream('intle:64=23'))
  2141. self.assertEqual(pack('<Q', 23), BitStream('uintle:64=23'))
  2142. self.assertEqual(pack('>b', 23), BitStream('intbe:8=23'))
  2143. self.assertEqual(pack('>B', 23), BitStream('uintbe:8=23'))
  2144. self.assertEqual(pack('>h', 23), BitStream('intbe:16=23'))
  2145. self.assertEqual(pack('>H', 23), BitStream('uintbe:16=23'))
  2146. self.assertEqual(pack('>l', 23), BitStream('intbe:32=23'))
  2147. self.assertEqual(pack('>L', 23), BitStream('uintbe:32=23'))
  2148. self.assertEqual(pack('>q', 23), BitStream('intbe:64=23'))
  2149. self.assertEqual(pack('>Q', 23), BitStream('uintbe:64=23'))
  2150. self.assertRaises(bitstring.CreationError, pack, '<B', -1)
  2151. self.assertRaises(bitstring.CreationError, pack, '<H', -1)
  2152. self.assertRaises(bitstring.CreationError, pack, '<L', -1)
  2153. self.assertRaises(bitstring.CreationError, pack, '<Q', -1)
  2154. def testStructTokens2(self):
  2155. endianness = sys.byteorder
  2156. sys.byteorder = 'little'
  2157. self.assertEqual(pack('@b', 23), BitStream('intle:8=23'))
  2158. self.assertEqual(pack('@B', 23), BitStream('uintle:8=23'))
  2159. self.assertEqual(pack('@h', 23), BitStream('intle:16=23'))
  2160. self.assertEqual(pack('@H', 23), BitStream('uintle:16=23'))
  2161. self.assertEqual(pack('@l', 23), BitStream('intle:32=23'))
  2162. self.assertEqual(pack('@L', 23), BitStream('uintle:32=23'))
  2163. self.assertEqual(pack('@q', 23), BitStream('intle:64=23'))
  2164. self.assertEqual(pack('@Q', 23), BitStream('uintle:64=23'))
  2165. sys.byteorder = 'big'
  2166. self.assertEqual(pack('@b', 23), BitStream('intbe:8=23'))
  2167. self.assertEqual(pack('@B', 23), BitStream('uintbe:8=23'))
  2168. self.assertEqual(pack('@h', 23), BitStream('intbe:16=23'))
  2169. self.assertEqual(pack('@H', 23), BitStream('uintbe:16=23'))
  2170. self.assertEqual(pack('@l', 23), BitStream('intbe:32=23'))
  2171. self.assertEqual(pack('@L', 23), BitStream('uintbe:32=23'))
  2172. self.assertEqual(pack('@q', 23), BitStream('intbe:64=23'))
  2173. self.assertEqual(pack('@Q', 23), BitStream('uintbe:64=23'))
  2174. sys.byteorder = endianness
  2175. def testNativeEndianness(self):
  2176. s = pack('@2L', 40, 40)
  2177. if sys.byteorder == 'little':
  2178. self.assertEqual(s, pack('<2L', 40, 40))
  2179. else:
  2180. self.assertEqual(sys.byteorder, 'big')
  2181. self.assertEqual(s, pack('>2L', 40, 40))
  2182. def testStructTokens2(self):
  2183. s = pack('>hhl', 1, 2, 3)
  2184. a, b, c = s.unpack('>hhl')
  2185. self.assertEqual((a, b, c), (1, 2, 3))
  2186. s = pack('<QL, >Q \tL', 1001, 43, 21, 9999)
  2187. self.assertEqual(s.unpack('<QL, >QL'), [1001, 43, 21, 9999])
  2188. def testStructTokensMultiplicativeFactors(self):
  2189. s = pack('<2h', 1, 2)
  2190. a, b = s.unpack('<2h')
  2191. self.assertEqual((a, b), (1, 2))
  2192. s = pack('<100q', *range(100))
  2193. self.assertEqual(s.len, 100 * 64)
  2194. self.assertEqual(s[44*64:45*64].uintle, 44)
  2195. s = pack('@L0B2h', 5, 5, 5)
  2196. self.assertEqual(s.unpack('@Lhh'), [5, 5, 5])
  2197. def testStructTokensErrors(self):
  2198. for f in ['>>q', '<>q', 'q>', '2q', 'q', '>-2q', '@a', '>int:8', '>q2']:
  2199. self.assertRaises(bitstring.CreationError, pack, f, 100)
  2200. def testImmutableBitStreams(self):
  2201. a = ConstBitStream('0x012345')
  2202. self.assertEqual(a, '0x012345')
  2203. b = BitStream('0xf') + a
  2204. self.assertEqual(b, '0xf012345')
  2205. try:
  2206. a.append(b)
  2207. self.assertTrue(False)
  2208. except AttributeError:
  2209. pass
  2210. try:
  2211. a.prepend(b)
  2212. self.assertTrue(False)
  2213. except AttributeError:
  2214. pass
  2215. try:
  2216. a[0] = '0b1'
  2217. self.assertTrue(False)
  2218. except TypeError:
  2219. pass
  2220. try:
  2221. del a[5]
  2222. self.assertTrue(False)
  2223. except TypeError:
  2224. pass
  2225. try:
  2226. a.replace('0b1', '0b0')
  2227. self.assertTrue(False)
  2228. except AttributeError:
  2229. pass
  2230. try:
  2231. a.insert('0b11', 4)
  2232. self.assertTrue(False)
  2233. except AttributeError:
  2234. pass
  2235. try:
  2236. a.reverse()
  2237. self.assertTrue(False)
  2238. except AttributeError:
  2239. pass
  2240. try:
  2241. a.reversebytes()
  2242. self.assertTrue(False)
  2243. except AttributeError:
  2244. pass
  2245. self.assertEqual(a, '0x012345')
  2246. self.assertTrue(isinstance(a, ConstBitStream))
  2247. def testReverseBytes(self):
  2248. a = BitStream('0x123456')
  2249. a.byteswap()
  2250. self.assertEqual(a, '0x563412')
  2251. b = a + '0b1'
  2252. b.byteswap()
  2253. self.assertEqual('0x123456, 0b1', b)
  2254. a = BitStream('0x54')
  2255. a.byteswap()
  2256. self.assertEqual(a, '0x54')
  2257. a = BitStream()
  2258. a.byteswap()
  2259. self.assertFalse(a)
  2260. def testReverseBytes2(self):
  2261. a = BitStream()
  2262. a.byteswap()
  2263. self.assertFalse(a)
  2264. a = BitStream('0x00112233')
  2265. a.byteswap(0, 0, 16)
  2266. self.assertEqual(a, '0x11002233')
  2267. a.byteswap(0, 4, 28)
  2268. self.assertEqual(a, '0x12302103')
  2269. a.byteswap(start=0, end=18)
  2270. self.assertEqual(a, '0x30122103')
  2271. self.assertRaises(ValueError, a.byteswap, 0, 10, 2)
  2272. self.assertRaises(ValueError, a.byteswap, 0, -4, 4)
  2273. self.assertRaises(ValueError, a.byteswap, 0, 24, 48)
  2274. a.byteswap(0, 24)
  2275. self.assertEqual(a, '0x30122103')
  2276. a.byteswap(0, 11, 11)
  2277. self.assertEqual(a, '0x30122103')
  2278. def testCapitalsInPack(self):
  2279. a = pack('A', A='0b1')
  2280. self.assertEqual(a, '0b1')
  2281. format = 'bits:4=BL_OFFT, uint:12=width, uint:12=height'
  2282. d = {'BL_OFFT': '0b1011', 'width': 352, 'height': 288}
  2283. s = bitstring.pack(format, **d)
  2284. self.assertEqual(s, '0b1011, uint:12=352, uint:12=288')
  2285. a = pack('0X0, uint:8, hex', 45, '0XABcD')
  2286. self.assertEqual(a, '0x0, uint:8=45, 0xabCD')
  2287. def testOtherCapitals(self):
  2288. a = ConstBitStream('0XABC, 0O0, 0B11')
  2289. self.assertEqual(a, 'hex=0Xabc, oct=0, bin=0B11')
  2290. def testEfficientOverwrite(self):
  2291. a = BitStream(1000000000)
  2292. a.overwrite([1], 123456)
  2293. self.assertEqual(a[123456], True)
  2294. a.overwrite('0xff', 1)
  2295. self.assertEqual(a[0:32:1], '0x7f800000')
  2296. b = BitStream('0xffff')
  2297. b.overwrite('0x0000')
  2298. self.assertEqual(b, '0x0000')
  2299. self.assertEqual(b.pos, 16)
  2300. c = BitStream(length=1000)
  2301. c.overwrite('0xaaaaaaaaaaaa', 81)
  2302. self.assertEqual(c[81:81 + 6 * 8], '0xaaaaaaaaaaaa')
  2303. self.assertEqual(len(list(c.findall('0b1'))), 24)
  2304. s = BitStream(length=1000)
  2305. s = s[5:]
  2306. s.overwrite('0xffffff', 500)
  2307. s.pos = 500
  2308. self.assertEqual(s.read(4 * 8), '0xffffff00')
  2309. s.overwrite('0xff', 502)
  2310. self.assertEqual(s[502:518], '0xffff')
  2311. def testPeekAndReadListErrors(self):
  2312. a = BitStream('0x123456')
  2313. self.assertRaises(ValueError, a.read, 'hex:8, hex:8')
  2314. self.assertRaises(ValueError, a.peek, 'hex:8, hex:8')
  2315. self.assertRaises(TypeError, a.read, 10, 12)
  2316. self.assertRaises(TypeError, a.peek, 12, 14)
  2317. self.assertRaises(TypeError, a.read, 8, 8)
  2318. self.assertRaises(TypeError, a.peek, 80, 80)
  2319. def testStartswith(self):
  2320. a = BitStream()
  2321. self.assertTrue(a.startswith(BitStream()))
  2322. self.assertFalse(a.startswith('0b0'))
  2323. a = BitStream('0x12ff')
  2324. self.assertTrue(a.startswith('0x1'))
  2325. self.assertTrue(a.startswith('0b0001001'))
  2326. self.assertTrue(a.startswith('0x12ff'))
  2327. self.assertFalse(a.startswith('0x12ff, 0b1'))
  2328. self.assertFalse(a.startswith('0x2'))
  2329. def testStartswithStartEnd(self):
  2330. s = BitStream('0x123456')
  2331. self.assertTrue(s.startswith('0x234', 4))
  2332. self.assertFalse(s.startswith('0x123', end=11))
  2333. self.assertTrue(s.startswith('0x123', end=12))
  2334. self.assertTrue(s.startswith('0x34', 8, 16))
  2335. self.assertFalse(s.startswith('0x34', 7, 16))
  2336. self.assertFalse(s.startswith('0x34', 9, 16))
  2337. self.assertFalse(s.startswith('0x34', 8, 15))
  2338. def testEndswith(self):
  2339. a = BitStream()
  2340. self.assertTrue(a.endswith(''))
  2341. self.assertFalse(a.endswith(BitStream('0b1')))
  2342. a = BitStream('0xf2341')
  2343. self.assertTrue(a.endswith('0x41'))
  2344. self.assertTrue(a.endswith('0b001'))
  2345. self.assertTrue(a.endswith('0xf2341'))
  2346. self.assertFalse(a.endswith('0x1f2341'))
  2347. self.assertFalse(a.endswith('0o34'))
  2348. def testEndswithStartEnd(self):
  2349. s = BitStream('0x123456')
  2350. self.assertTrue(s.endswith('0x234', end=16))
  2351. self.assertFalse(s.endswith('0x456', start=13))
  2352. self.assertTrue(s.endswith('0x456', start=12))
  2353. self.assertTrue(s.endswith('0x34', 8, 16))
  2354. self.assertTrue(s.endswith('0x34', 7, 16))
  2355. self.assertFalse(s.endswith('0x34', 9, 16))
  2356. self.assertFalse(s.endswith('0x34', 8, 15))
  2357. def testUnhashability(self):
  2358. s = BitStream('0xf')
  2359. self.assertRaises(TypeError, set, [s])
  2360. self.assertRaises(TypeError, hash, [s])
  2361. def testConstBitStreamSetCreation(self):
  2362. sl = [ConstBitStream(uint=i, length=7) for i in range(15)]
  2363. s = set(sl)
  2364. self.assertEqual(len(s), 15)
  2365. s.add(ConstBitStream('0b0000011'))
  2366. self.assertEqual(len(s), 15)
  2367. self.assertRaises(TypeError, s.add, BitStream('0b0000011'))
  2368. def testConstBitStreamFunctions(self):
  2369. s = ConstBitStream('0xf, 0b1')
  2370. self.assertEqual(type(s), ConstBitStream)
  2371. t = copy.copy(s)
  2372. self.assertEqual(type(t), ConstBitStream)
  2373. a = s + '0o3'
  2374. self.assertEqual(type(a), ConstBitStream)
  2375. b = a[0:4]
  2376. self.assertEqual(type(b), ConstBitStream)
  2377. b = a[4:3]
  2378. self.assertEqual(type(b), ConstBitStream)
  2379. b = a[5:2:-1]
  2380. self.assertEqual(type(b), ConstBitStream)
  2381. b = ~a
  2382. self.assertEqual(type(b), ConstBitStream)
  2383. b = a << 2
  2384. self.assertEqual(type(b), ConstBitStream)
  2385. b = a >> 2
  2386. self.assertEqual(type(b), ConstBitStream)
  2387. b = a * 2
  2388. self.assertEqual(type(b), ConstBitStream)
  2389. b = a * 0
  2390. self.assertEqual(type(b), ConstBitStream)
  2391. b = a & ~a
  2392. self.assertEqual(type(b), ConstBitStream)
  2393. b = a | ~a
  2394. self.assertEqual(type(b), ConstBitStream)
  2395. b = a ^ ~a
  2396. self.assertEqual(type(b), ConstBitStream)
  2397. b = a._slice(4, 4)
  2398. self.assertEqual(type(b), ConstBitStream)
  2399. b = a.read(4)
  2400. self.assertEqual(type(b), ConstBitStream)
  2401. def testConstBitStreamProperties(self):
  2402. a = ConstBitStream('0x123123')
  2403. try:
  2404. a.hex = '0x234'
  2405. self.assertTrue(False)
  2406. except AttributeError:
  2407. pass
  2408. try:
  2409. a.oct = '0o234'
  2410. self.assertTrue(False)
  2411. except AttributeError:
  2412. pass
  2413. try:
  2414. a.bin = '0b101'
  2415. self.assertTrue(False)
  2416. except AttributeError:
  2417. pass
  2418. try:
  2419. a.ue = 3453
  2420. self.assertTrue(False)
  2421. except AttributeError:
  2422. pass
  2423. try:
  2424. a.se = -123
  2425. self.assertTrue(False)
  2426. except AttributeError:
  2427. pass
  2428. try:
  2429. a.int = 432
  2430. self.assertTrue(False)
  2431. except AttributeError:
  2432. pass
  2433. try:
  2434. a.uint = 4412
  2435. self.assertTrue(False)
  2436. except AttributeError:
  2437. pass
  2438. try:
  2439. a.intle = 123
  2440. self.assertTrue(False)
  2441. except AttributeError:
  2442. pass
  2443. try:
  2444. a.uintle = 4412
  2445. self.assertTrue(False)
  2446. except AttributeError:
  2447. pass
  2448. try:
  2449. a.intbe = 123
  2450. self.assertTrue(False)
  2451. except AttributeError:
  2452. pass
  2453. try:
  2454. a.uintbe = 4412
  2455. self.assertTrue(False)
  2456. except AttributeError:
  2457. pass
  2458. try:
  2459. a.intne = 123
  2460. self.assertTrue(False)
  2461. except AttributeError:
  2462. pass
  2463. try:
  2464. a.uintne = 4412
  2465. self.assertTrue(False)
  2466. except AttributeError:
  2467. pass
  2468. try:
  2469. a.bytes = b'hello'
  2470. self.assertTrue(False)
  2471. except AttributeError:
  2472. pass
  2473. def testConstBitStreamMisc(self):
  2474. a = ConstBitStream('0xf')
  2475. b = a
  2476. a += '0xe'
  2477. self.assertEqual(b, '0xf')
  2478. self.assertEqual(a, '0xfe')
  2479. c = BitStream(a)
  2480. self.assertEqual(a, c)
  2481. a = ConstBitStream('0b1')
  2482. a._append(a)
  2483. self.assertEqual(a, '0b11')
  2484. self.assertEqual(type(a), ConstBitStream)
  2485. a._prepend(a)
  2486. self.assertEqual(a, '0b1111')
  2487. self.assertEqual(type(a), ConstBitStream)
  2488. def testConstBitStreamHashibility(self):
  2489. a = ConstBitStream('0x1')
  2490. b = ConstBitStream('0x2')
  2491. c = ConstBitStream('0x1')
  2492. c.pos = 3
  2493. s = set((a, b, c))
  2494. self.assertEqual(len(s), 2)
  2495. self.assertEqual(hash(a), hash(c))
  2496. def testConstBitStreamCopy(self):
  2497. a = ConstBitStream('0xabc')
  2498. a.pos = 11
  2499. b = copy.copy(a)
  2500. b.pos = 4
  2501. self.assertEqual(id(a._datastore), id(b._datastore))
  2502. self.assertEqual(a.pos, 11)
  2503. self.assertEqual(b.pos, 4)
  2504. def testPython26stuff(self):
  2505. s = BitStream('0xff')
  2506. self.assertTrue(isinstance(s.tobytes(), bytes))
  2507. self.assertTrue(isinstance(s.bytes, bytes))
  2508. def testReadFromBits(self):
  2509. a = ConstBitStream('0xaabbccdd')
  2510. b = a.read(8)
  2511. self.assertEqual(b, '0xaa')
  2512. self.assertEqual(a[0:8], '0xaa')
  2513. self.assertEqual(a[-1], True)
  2514. a.pos = 0
  2515. self.assertEqual(a.read(4).uint, 10)
  2516. class Set(unittest.TestCase):
  2517. def testSet(self):
  2518. a = BitStream(length=16)
  2519. a.set(True, 0)
  2520. self.assertEqual(a, '0b10000000 00000000')
  2521. a.set(1, 15)
  2522. self.assertEqual(a, '0b10000000 00000001')
  2523. b = a[4:12]
  2524. b.set(True, 1)
  2525. self.assertEqual(b, '0b01000000')
  2526. b.set(True, -1)
  2527. self.assertEqual(b, '0b01000001')
  2528. b.set(1, -8)
  2529. self.assertEqual(b, '0b11000001')
  2530. self.assertRaises(IndexError, b.set, True, -9)
  2531. self.assertRaises(IndexError, b.set, True, 8)
  2532. def testSetNegativeIndex(self):
  2533. a = BitStream(10)
  2534. a.set(1, -1)
  2535. self.assertEqual(a.bin, '0000000001')
  2536. a.set(1, [-1, -10])
  2537. self.assertEqual(a.bin, '1000000001')
  2538. self.assertRaises(IndexError, a.set, 1, [-11])
  2539. def testFileBasedSetUnset(self):
  2540. a = BitStream(filename='test.m1v')
  2541. a.set(True, (0, 1, 2, 3, 4))
  2542. self.assertEqual(a[0:32], '0xf80001b3')
  2543. a = BitStream(filename='test.m1v')
  2544. a.set(False, (28, 29, 30, 31))
  2545. self.assertTrue(a.startswith('0x000001b0'))
  2546. def testSetList(self):
  2547. a = BitStream(length=18)
  2548. a.set(True, range(18))
  2549. self.assertEqual(a.int, -1)
  2550. a.set(False, range(18))
  2551. self.assertEqual(a.int, 0)
  2552. def testUnset(self):
  2553. a = BitStream(length=16, int=-1)
  2554. a.set(False, 0)
  2555. self.assertEqual(~a, '0b10000000 00000000')
  2556. a.set(0, 15)
  2557. self.assertEqual(~a, '0b10000000 00000001')
  2558. b = a[4:12]
  2559. b.set(False, 1)
  2560. self.assertEqual(~b, '0b01000000')
  2561. b.set(False, -1)
  2562. self.assertEqual(~b, '0b01000001')
  2563. b.set(False, -8)
  2564. self.assertEqual(~b, '0b11000001')
  2565. self.assertRaises(IndexError, b.set, False, -9)
  2566. self.assertRaises(IndexError, b.set, False, 8)
  2567. def testSetWholeBitStream(self):
  2568. a = BitStream(14)
  2569. a.set(1)
  2570. self.assertTrue(a.all(1))
  2571. a.set(0)
  2572. self.assertTrue(a.all(0))
  2573. class Invert(unittest.TestCase):
  2574. def testInvertBits(self):
  2575. a = BitStream('0b111000')
  2576. a.invert(range(a.len))
  2577. self.assertEqual(a, '0b000111')
  2578. a.invert([0, 1, -1])
  2579. self.assertEqual(a, '0b110110')
  2580. def testInvertWholeBitStream(self):
  2581. a = BitStream('0b11011')
  2582. a.invert()
  2583. self.assertEqual(a, '0b00100')
  2584. def testInvertSingleBit(self):
  2585. a = BitStream('0b000001')
  2586. a.invert(0)
  2587. self.assertEqual(a.bin, '100001')
  2588. a.invert(-1)
  2589. self.assertEqual(a.bin, '100000')
  2590. def testInvertErrors(self):
  2591. a = BitStream(10)
  2592. self.assertRaises(IndexError, a.invert, 10)
  2593. self.assertRaises(IndexError, a.invert, -11)
  2594. self.assertRaises(IndexError, a.invert, [1, 2, 10])
  2595. #######################
  2596. def testIor(self):
  2597. a = BitStream('0b1101001')
  2598. a |= '0b1110000'
  2599. self.assertEqual(a, '0b1111001')
  2600. b = a[2:]
  2601. c = a[1:-1]
  2602. b |= c
  2603. self.assertEqual(c, '0b11100')
  2604. self.assertEqual(b, '0b11101')
  2605. def testIand(self):
  2606. a = BitStream('0b0101010101000')
  2607. a &= '0b1111110000000'
  2608. self.assertEqual(a, '0b0101010000000')
  2609. s = BitStream(filename='test.m1v', offset=26, length=24)
  2610. s &= '0xff00ff'
  2611. self.assertEqual(s, '0xcc0004')
  2612. def testIxor(self):
  2613. a = BitStream('0b11001100110011')
  2614. a ^= '0b11111100000010'
  2615. self.assertEqual(a, '0b00110000110001')
  2616. def testLogicalInplaceErrors(self):
  2617. a = BitStream(4)
  2618. self.assertRaises(ValueError, a.__ior__, '0b111')
  2619. self.assertRaises(ValueError, a.__iand__, '0b111')
  2620. self.assertRaises(ValueError, a.__ixor__, '0b111')
  2621. class AllAndAny(unittest.TestCase):
  2622. def testAll(self):
  2623. a = BitStream('0b0111')
  2624. self.assertTrue(a.all(True, (1, 3)))
  2625. self.assertFalse(a.all(True, (0, 1, 2)))
  2626. self.assertTrue(a.all(True, [-1]))
  2627. self.assertFalse(a.all(True, [0]))
  2628. def testFileBasedAll(self):
  2629. a = BitStream(filename='test.m1v')
  2630. self.assertTrue(a.all(True, [31]))
  2631. a = BitStream(filename='test.m1v')
  2632. self.assertTrue(a.all(False, (0, 1, 2, 3, 4)))
  2633. def testFileBasedAny(self):
  2634. a = BitStream(filename='test.m1v')
  2635. self.assertTrue(a.any(True, (31, 12)))
  2636. a = BitStream(filename='test.m1v')
  2637. self.assertTrue(a.any(False, (0, 1, 2, 3, 4)))
  2638. def testAny(self):
  2639. a = BitStream('0b10011011')
  2640. self.assertTrue(a.any(True, (1, 2, 3, 5)))
  2641. self.assertFalse(a.any(True, (1, 2, 5)))
  2642. self.assertTrue(a.any(True, (-1,)))
  2643. self.assertFalse(a.any(True, (1,)))
  2644. def testAllFalse(self):
  2645. a = BitStream('0b0010011101')
  2646. self.assertTrue(a.all(False, (0, 1, 3, 4)))
  2647. self.assertFalse(a.all(False, (0, 1, 2, 3, 4)))
  2648. def testAnyFalse(self):
  2649. a = BitStream('0b01001110110111111111111111111')
  2650. self.assertTrue(a.any(False, (4, 5, 6, 2)))
  2651. self.assertFalse(a.any(False, (1, 15, 20)))
  2652. def testAnyEmptyBitstring(self):
  2653. a = ConstBitStream()
  2654. self.assertFalse(a.any(True))
  2655. self.assertFalse(a.any(False))
  2656. def testAllEmptyBitStream(self):
  2657. a = ConstBitStream()
  2658. self.assertTrue(a.all(True))
  2659. self.assertTrue(a.all(False))
  2660. def testAnyWholeBitstring(self):
  2661. a = ConstBitStream('0xfff')
  2662. self.assertTrue(a.any(True))
  2663. self.assertFalse(a.any(False))
  2664. def testAllWholeBitstring(self):
  2665. a = ConstBitStream('0xfff')
  2666. self.assertTrue(a.all(True))
  2667. self.assertFalse(a.all(False))
  2668. def testErrors(self):
  2669. a = BitStream('0xf')
  2670. self.assertRaises(IndexError, a.all, True, [5])
  2671. self.assertRaises(IndexError, a.all, True, [-5])
  2672. self.assertRaises(IndexError, a.any, True, [5])
  2673. self.assertRaises(IndexError, a.any, True, [-5])
  2674. ###################
  2675. def testFloatInitialisation(self):
  2676. for f in (0.0000001, -1.0, 1.0, 0.2, -3.1415265, 1.331e32):
  2677. a = BitStream(float=f, length=64)
  2678. a.pos = 6
  2679. self.assertEqual(a.float, f)
  2680. a = BitStream('float:64=%s' % str(f))
  2681. a.pos = 6
  2682. self.assertEqual(a.float, f)
  2683. a = BitStream('floatbe:64=%s' % str(f))
  2684. a.pos = 6
  2685. self.assertEqual(a.floatbe, f)
  2686. a = BitStream('floatle:64=%s' % str(f))
  2687. a.pos = 6
  2688. self.assertEqual(a.floatle, f)
  2689. a = BitStream('floatne:64=%s' % str(f))
  2690. a.pos = 6
  2691. self.assertEqual(a.floatne, f)
  2692. b = BitStream(float=f, length=32)
  2693. b.pos = 6
  2694. self.assertAlmostEqual(b.float / f, 1.0)
  2695. b = BitStream('float:32=%s' % str(f))
  2696. b.pos = 6
  2697. self.assertAlmostEqual(b.float / f, 1.0)
  2698. b = BitStream('floatbe:32=%s' % str(f))
  2699. b.pos = 6
  2700. self.assertAlmostEqual(b.floatbe / f, 1.0)
  2701. b = BitStream('floatle:32=%s' % str(f))
  2702. b.pos = 6
  2703. self.assertAlmostEqual(b.floatle / f, 1.0)
  2704. b = BitStream('floatne:32=%s' % str(f))
  2705. b.pos = 6
  2706. self.assertAlmostEqual(b.floatne / f, 1.0)
  2707. a = BitStream('0x12345678')
  2708. a.pos = 6
  2709. a.float = 23
  2710. self.assertEqual(a.float, 23.0)
  2711. def testFloatInitStrings(self):
  2712. for s in ('5', '+0.0001', '-1e101', '4.', '.2', '-.65', '43.21E+32'):
  2713. a = BitStream('float:64=%s' % s)
  2714. self.assertEqual(a.float, float(s))
  2715. def testFloatPacking(self):
  2716. a = pack('>d', 0.01)
  2717. self.assertEqual(a.float, 0.01)
  2718. self.assertEqual(a.floatbe, 0.01)
  2719. a.byteswap()
  2720. self.assertEqual(a.floatle, 0.01)
  2721. b = pack('>f', 1e10)
  2722. self.assertAlmostEqual(b.float / 1e10, 1.0)
  2723. c = pack('<f', 10.3)
  2724. self.assertAlmostEqual(c.floatle / 10.3, 1.0)
  2725. d = pack('>5d', 10.0, 5.0, 2.5, 1.25, 0.1)
  2726. self.assertEqual(d.unpack('>5d'), [10.0, 5.0, 2.5, 1.25, 0.1])
  2727. def testFloatReading(self):
  2728. a = BitStream('floatle:64=12, floatbe:64=-0.01, floatne:64=3e33')
  2729. x, y, z = a.readlist('floatle:64, floatbe:64, floatne:64')
  2730. self.assertEqual(x, 12.0)
  2731. self.assertEqual(y, -0.01)
  2732. self.assertEqual(z, 3e33)
  2733. a = BitStream('floatle:32=12, floatbe:32=-0.01, floatne:32=3e33')
  2734. x, y, z = a.readlist('floatle:32, floatbe:32, floatne:32')
  2735. self.assertAlmostEqual(x / 12.0, 1.0)
  2736. self.assertAlmostEqual(y / -0.01, 1.0)
  2737. self.assertAlmostEqual(z / 3e33, 1.0)
  2738. a = BitStream('0b11, floatle:64=12, 0xfffff')
  2739. a.pos = 2
  2740. self.assertEqual(a.read('floatle:64'), 12.0)
  2741. b = BitStream(floatle=20, length=32)
  2742. b.floatle = 10.0
  2743. b = [0] + b
  2744. self.assertEqual(b[1:].floatle, 10.0)
  2745. def testNonAlignedFloatReading(self):
  2746. s = BitStream('0b1, float:32 = 10.0')
  2747. x, y = s.readlist('1, float:32')
  2748. self.assertEqual(y, 10.0)
  2749. s[1:] = 'floatle:32=20.0'
  2750. x, y = s.unpack('1, floatle:32')
  2751. self.assertEqual(y, 20.0)
  2752. def testFloatErrors(self):
  2753. a = BitStream('0x3')
  2754. self.assertRaises(bitstring.InterpretError, a._getfloat)
  2755. self.assertRaises(bitstring.CreationError, a._setfloat, -0.2)
  2756. for l in (8, 10, 12, 16, 30, 128, 200):
  2757. self.assertRaises(ValueError, BitStream, float=1.0, length=l)
  2758. self.assertRaises(bitstring.CreationError, BitStream, floatle=0.3, length=0)
  2759. self.assertRaises(bitstring.CreationError, BitStream, floatle=0.3, length=1)
  2760. self.assertRaises(bitstring.CreationError, BitStream, float=2)
  2761. self.assertRaises(bitstring.InterpretError, a.read, 'floatle:2')
  2762. def testReadErrorChangesPos(self):
  2763. a = BitStream('0x123123')
  2764. try:
  2765. a.read('10, 5')
  2766. except ValueError:
  2767. pass
  2768. self.assertEqual(a.pos, 0)
  2769. def testRor(self):
  2770. a = BitStream('0b11001')
  2771. a.ror(0)
  2772. self.assertEqual(a, '0b11001')
  2773. a.ror(1)
  2774. self.assertEqual(a, '0b11100')
  2775. a.ror(5)
  2776. self.assertEqual(a, '0b11100')
  2777. a.ror(101)
  2778. self.assertEqual(a, '0b01110')
  2779. a = BitStream('0b1')
  2780. a.ror(1000000)
  2781. self.assertEqual(a, '0b1')
  2782. def testRorErrors(self):
  2783. a = BitStream()
  2784. self.assertRaises(bitstring.Error, a.ror, 0)
  2785. a += '0b001'
  2786. self.assertRaises(ValueError, a.ror, -1)
  2787. def testRol(self):
  2788. a = BitStream('0b11001')
  2789. a.rol(0)
  2790. self.assertEqual(a, '0b11001')
  2791. a.rol(1)
  2792. self.assertEqual(a, '0b10011')
  2793. a.rol(5)
  2794. self.assertEqual(a, '0b10011')
  2795. a.rol(101)
  2796. self.assertEqual(a, '0b00111')
  2797. a = BitStream('0b1')
  2798. a.rol(1000000)
  2799. self.assertEqual(a, '0b1')
  2800. def testRolFromFile(self):
  2801. a = BitStream(filename='test.m1v')
  2802. l = a.len
  2803. a.rol(1)
  2804. self.assertTrue(a.startswith('0x000003'))
  2805. self.assertEqual(a.len, l)
  2806. self.assertTrue(a.endswith('0x0036e'))
  2807. def testRorFromFile(self):
  2808. a = BitStream(filename='test.m1v')
  2809. l = a.len
  2810. a.ror(1)
  2811. self.assertTrue(a.startswith('0x800000'))
  2812. self.assertEqual(a.len, l)
  2813. self.assertTrue(a.endswith('0x000db'))
  2814. def testRolErrors(self):
  2815. a = BitStream()
  2816. self.assertRaises(bitstring.Error, a.rol, 0)
  2817. a += '0b001'
  2818. self.assertRaises(ValueError, a.rol, -1)
  2819. def testBytesToken(self):
  2820. a = BitStream('0x010203')
  2821. b = a.read('bytes:1')
  2822. self.assertTrue(isinstance(b, bytes))
  2823. self.assertEqual(b, b'\x01')
  2824. x, y, z = a.unpack('4, bytes:2, uint')
  2825. self.assertEqual(x, 0)
  2826. self.assertEqual(y, b'\x10\x20')
  2827. self.assertEqual(z, 3)
  2828. s = pack('bytes:4', b'abcd')
  2829. self.assertEqual(s.bytes, b'abcd')
  2830. def testBytesTokenMoreThoroughly(self):
  2831. a = BitStream('0x0123456789abcdef')
  2832. a.pos += 16
  2833. self.assertEqual(a.read('bytes:1'), b'\x45')
  2834. self.assertEqual(a.read('bytes:3'), b'\x67\x89\xab')
  2835. x, y, z = a.unpack('bits:28, bytes, bits:12')
  2836. self.assertEqual(y, b'\x78\x9a\xbc')
  2837. def testDedicatedReadFunctions(self):
  2838. a = BitStream('0b11, uint:43=98798798172, 0b11111')
  2839. x = a._readuint(43, 2)
  2840. self.assertEqual(x, 98798798172)
  2841. self.assertEqual(a.pos, 0)
  2842. x = a._readint(43, 2)
  2843. self.assertEqual(x, 98798798172)
  2844. self.assertEqual(a.pos, 0)
  2845. a = BitStream('0b11, uintbe:48=98798798172, 0b11111')
  2846. x = a._readuintbe(48, 2)
  2847. self.assertEqual(x, 98798798172)
  2848. self.assertEqual(a.pos, 0)
  2849. x = a._readintbe(48, 2)
  2850. self.assertEqual(x, 98798798172)
  2851. self.assertEqual(a.pos, 0)
  2852. a = BitStream('0b111, uintle:40=123516, 0b111')
  2853. self.assertEqual(a._readuintle(40, 3), 123516)
  2854. b = BitStream('0xff, uintle:800=999, 0xffff')
  2855. self.assertEqual(b._readuintle(800, 8), 999)
  2856. a = BitStream('0b111, intle:48=999999999, 0b111111111111')
  2857. self.assertEqual(a._readintle(48, 3), 999999999)
  2858. b = BitStream('0xff, intle:200=918019283740918263512351235, 0xfffffff')
  2859. self.assertEqual(b._readintle(200, 8), 918019283740918263512351235)
  2860. a = BitStream('0b111, floatbe:64=-5.32, 0xffffffff')
  2861. self.assertEqual(a._readfloat(64, 3), -5.32)
  2862. a = BitStream('0b111, floatle:64=9.9998, 0b111')
  2863. self.assertEqual(a._readfloatle(64, 3), 9.9998)
  2864. def testAutoInitWithInt(self):
  2865. a = BitStream(0)
  2866. self.assertFalse(a)
  2867. a = BitStream(1)
  2868. self.assertEqual(a, '0b0')
  2869. a = BitStream(1007)
  2870. self.assertEqual(a, BitStream(length=1007))
  2871. self.assertRaises(bitstring.CreationError, BitStream, -1)
  2872. a = 6 + ConstBitStream('0b1') + 3
  2873. self.assertEqual(a, '0b0000001000')
  2874. a += 1
  2875. self.assertEqual(a, '0b00000010000')
  2876. self.assertEqual(ConstBitStream(13), 13)
  2877. def testReadingProblems(self):
  2878. a = BitStream('0x000001')
  2879. b = a.read('uint:24')
  2880. self.assertEqual(b, 1)
  2881. a.pos = 0
  2882. self.assertRaises(bitstring.ReadError, a.read, 'bytes:4')
  2883. def testAddVersesInPlaceAdd(self):
  2884. a1 = ConstBitStream('0xabc')
  2885. b1 = a1
  2886. a1 += '0xdef'
  2887. self.assertEqual(a1, '0xabcdef')
  2888. self.assertEqual(b1, '0xabc')
  2889. a2 = BitStream('0xabc')
  2890. b2 = a2
  2891. c2 = a2 + '0x0'
  2892. a2 += '0xdef'
  2893. self.assertEqual(a2, '0xabcdef')
  2894. self.assertEqual(b2, '0xabcdef')
  2895. self.assertEqual(c2, '0xabc0')
  2896. def testAndVersesInPlaceAnd(self):
  2897. a1 = ConstBitStream('0xabc')
  2898. b1 = a1
  2899. a1 &= '0xf0f'
  2900. self.assertEqual(a1, '0xa0c')
  2901. self.assertEqual(b1, '0xabc')
  2902. a2 = BitStream('0xabc')
  2903. b2 = a2
  2904. c2 = a2 & '0x00f'
  2905. a2 &= '0xf0f'
  2906. self.assertEqual(a2, '0xa0c')
  2907. self.assertEqual(b2, '0xa0c')
  2908. self.assertEqual(c2, '0x00c')
  2909. def testOrVersesInPlaceOr(self):
  2910. a1 = ConstBitStream('0xabc')
  2911. b1 = a1
  2912. a1 |= '0xf0f'
  2913. self.assertEqual(a1, '0xfbf')
  2914. self.assertEqual(b1, '0xabc')
  2915. a2 = BitStream('0xabc')
  2916. b2 = a2
  2917. c2 = a2 | '0x00f'
  2918. a2 |= '0xf0f'
  2919. self.assertEqual(a2, '0xfbf')
  2920. self.assertEqual(b2, '0xfbf')
  2921. self.assertEqual(c2, '0xabf')
  2922. def testXorVersesInPlaceXor(self):
  2923. a1 = ConstBitStream('0xabc')
  2924. b1 = a1
  2925. a1 ^= '0xf0f'
  2926. self.assertEqual(a1, '0x5b3')
  2927. self.assertEqual(b1, '0xabc')
  2928. a2 = BitStream('0xabc')
  2929. b2 = a2
  2930. c2 = a2 ^ '0x00f'
  2931. a2 ^= '0xf0f'
  2932. self.assertEqual(a2, '0x5b3')
  2933. self.assertEqual(b2, '0x5b3')
  2934. self.assertEqual(c2, '0xab3')
  2935. def testMulVersesInPlaceMul(self):
  2936. a1 = ConstBitStream('0xabc')
  2937. b1 = a1
  2938. a1 *= 3
  2939. self.assertEqual(a1, '0xabcabcabc')
  2940. self.assertEqual(b1, '0xabc')
  2941. a2 = BitStream('0xabc')
  2942. b2 = a2
  2943. c2 = a2 * 2
  2944. a2 *= 3
  2945. self.assertEqual(a2, '0xabcabcabc')
  2946. self.assertEqual(b2, '0xabcabcabc')
  2947. self.assertEqual(c2, '0xabcabc')
  2948. def testLshiftVersesInPlaceLshift(self):
  2949. a1 = ConstBitStream('0xabc')
  2950. b1 = a1
  2951. a1 <<= 4
  2952. self.assertEqual(a1, '0xbc0')
  2953. self.assertEqual(b1, '0xabc')
  2954. a2 = BitStream('0xabc')
  2955. b2 = a2
  2956. c2 = a2 << 8
  2957. a2 <<= 4
  2958. self.assertEqual(a2, '0xbc0')
  2959. self.assertEqual(b2, '0xbc0')
  2960. self.assertEqual(c2, '0xc00')
  2961. def testRshiftVersesInPlaceRshift(self):
  2962. a1 = ConstBitStream('0xabc')
  2963. b1 = a1
  2964. a1 >>= 4
  2965. self.assertEqual(a1, '0x0ab')
  2966. self.assertEqual(b1, '0xabc')
  2967. a2 = BitStream('0xabc')
  2968. b2 = a2
  2969. c2 = a2 >> 8
  2970. a2 >>= 4
  2971. self.assertEqual(a2, '0x0ab')
  2972. self.assertEqual(b2, '0x0ab')
  2973. self.assertEqual(c2, '0x00a')
  2974. def testAutoFromBool(self):
  2975. a = ConstBitStream() + True + False + True
  2976. self.assertEqual(a, '0b00')
  2977. # self.assertEqual(a, '0b101')
  2978. # b = ConstBitStream(False)
  2979. # self.assertEqual(b, '0b0')
  2980. # c = ConstBitStream(True)
  2981. # self.assertEqual(c, '0b1')
  2982. # self.assertEqual(b, False)
  2983. # self.assertEqual(c, True)
  2984. # self.assertEqual(b & True, False)
  2985. class Bugs(unittest.TestCase):
  2986. def testBugInReplace(self):
  2987. s = BitStream('0x00112233')
  2988. l = list(s.split('0x22', start=8, bytealigned=True))
  2989. self.assertEqual(l, ['0x11', '0x2233'])
  2990. s = BitStream('0x00112233')
  2991. s.replace('0x22', '0xffff', start=8, bytealigned=True)
  2992. self.assertEqual(s, '0x0011ffff33')
  2993. s = BitStream('0x0123412341234')
  2994. s.replace('0x23', '0xf', start=9, bytealigned=True)
  2995. self.assertEqual(s, '0x012341f41f4')
  2996. def testTruncateStartBug(self):
  2997. a = BitStream('0b000000111')[2:]
  2998. a._truncatestart(6)
  2999. self.assertEqual(a, '0b1')
  3000. def testNullBits(self):
  3001. s = ConstBitStream(bin='')
  3002. t = ConstBitStream(oct='')
  3003. u = ConstBitStream(hex='')
  3004. v = ConstBitStream(bytes=b'')
  3005. self.assertFalse(s)
  3006. self.assertFalse(t)
  3007. self.assertFalse(u)
  3008. self.assertFalse(v)
  3009. def testMultiplicativeFactorsCreation(self):
  3010. s = BitStream('1*0b1')
  3011. self.assertEqual(s, '0b1')
  3012. s = BitStream('4*0xc')
  3013. self.assertEqual(s, '0xcccc')
  3014. s = BitStream('0b1, 0*0b0')
  3015. self.assertEqual(s, '0b1')
  3016. s = BitStream('0b1, 3*uint:8=34, 2*0o755')
  3017. self.assertEqual(s, '0b1, uint:8=34, uint:8=34, uint:8=34, 0o755755')
  3018. s = BitStream('0*0b1001010')
  3019. self.assertFalse(s)
  3020. def testMultiplicativeFactorsReading(self):
  3021. s = BitStream('0xc') * 5
  3022. a, b, c, d, e = s.readlist('5*4')
  3023. self.assertTrue(a == b == c == d == e == 12)
  3024. s = ConstBitStream('2*0b101, 4*uint:7=3')
  3025. a, b, c, d, e = s.readlist('2*bin:3, 3*uint:7')
  3026. self.assertTrue(a == b == '101')
  3027. self.assertTrue(c == d == e == 3)
  3028. def testMultiplicativeFactorsPacking(self):
  3029. s = pack('3*bin', '1', '001', '101')
  3030. self.assertEqual(s, '0b1001101')
  3031. s = pack('hex, 2*se=-56, 3*uint:37', '34', 1, 2, 3)
  3032. a, b, c, d, e, f = s.unpack('hex:8, 2*se, 3*uint:37')
  3033. self.assertEqual(a, '34')
  3034. self.assertEqual(b, -56)
  3035. self.assertEqual(c, -56)
  3036. self.assertEqual((d, e, f), (1, 2, 3))
  3037. # This isn't allowed yet. See comment in tokenparser.
  3038. #s = pack('fluffy*uint:8', *range(3), fluffy=3)
  3039. #a, b, c = s.readlist('2*uint:8, 1*uint:8, 0*uint:8')
  3040. #self.assertEqual((a, b, c), (0, 1, 2))
  3041. def testMultiplicativeFactorsUnpacking(self):
  3042. s = ConstBitStream('0b10111')
  3043. a, b, c, d = s.unpack('3*bool, bin')
  3044. self.assertEqual((a, b, c), (True, False, True))
  3045. self.assertEqual(d, '11')
  3046. def testPackingDefaultIntWithKeyword(self):
  3047. s = pack('12', 100)
  3048. self.assertEqual(s.unpack('12')[0], 100)
  3049. s = pack('oh_no_not_the_eyes=33', oh_no_not_the_eyes=17)
  3050. self.assertEqual(s.uint, 33)
  3051. self.assertEqual(s.len, 17)
  3052. def testInitFromIterable(self):
  3053. self.assertTrue(isinstance(range(10), collections.Iterable))
  3054. s = ConstBitStream(range(12))
  3055. self.assertEqual(s, '0x7ff')
  3056. def testFunctionNegativeIndices(self):
  3057. # insert
  3058. s = BitStream('0b0111')
  3059. s.insert('0b0', -1)
  3060. self.assertEqual(s, '0b01101')
  3061. self.assertRaises(ValueError, s.insert, '0b0', -1000)
  3062. # reverse
  3063. s.reverse(-2)
  3064. self.assertEqual(s, '0b01110')
  3065. t = BitStream('0x778899abcdef')
  3066. t.reverse(-12, -4)
  3067. self.assertEqual(t, '0x778899abc7bf')
  3068. # reversebytes
  3069. t.byteswap(0, -40, -16)
  3070. self.assertEqual(t, '0x77ab9988c7bf')
  3071. # overwrite
  3072. t.overwrite('0x666', -20)
  3073. self.assertEqual(t, '0x77ab998666bf')
  3074. # find
  3075. found = t.find('0x998', bytealigned=True, start=-31)
  3076. self.assertFalse(found)
  3077. found = t.find('0x998', bytealigned=True, start=-32)
  3078. self.assertTrue(found)
  3079. self.assertEqual(t.pos, 16)
  3080. t.pos = 0
  3081. found = t.find('0x988', bytealigned=True, end=-21)
  3082. self.assertFalse(found)
  3083. found = t.find('0x998', bytealigned=True, end=-20)
  3084. self.assertTrue(found)
  3085. self.assertEqual(t.pos, 16)
  3086. #findall
  3087. s = BitStream('0x1234151f')
  3088. l = list(s.findall('0x1', bytealigned=True, start=-15))
  3089. self.assertEqual(l, [24])
  3090. l = list(s.findall('0x1', bytealigned=True, start=-16))
  3091. self.assertEqual(l, [16, 24])
  3092. l = list(s.findall('0x1', bytealigned=True, end=-5))
  3093. self.assertEqual(l, [0, 16])
  3094. l = list(s.findall('0x1', bytealigned=True, end=-4))
  3095. self.assertEqual(l, [0, 16, 24])
  3096. # rfind
  3097. found = s.rfind('0x1f', end=-1)
  3098. self.assertFalse(found)
  3099. found = s.rfind('0x12', start=-31)
  3100. self.assertFalse(found)
  3101. # cut
  3102. s = BitStream('0x12345')
  3103. l = list(s.cut(4, start=-12, end=-4))
  3104. self.assertEqual(l, ['0x3', '0x4'])
  3105. # split
  3106. s = BitStream('0xfe0012fe1200fe')
  3107. l = list(s.split('0xfe', bytealigned=True, end=-1))
  3108. self.assertEqual(l, ['', '0xfe0012', '0xfe1200f, 0b111'])
  3109. l = list(s.split('0xfe', bytealigned=True, start=-8))
  3110. self.assertEqual(l, ['', '0xfe'])
  3111. # startswith
  3112. self.assertTrue(s.startswith('0x00f', start=-16))
  3113. self.assertTrue(s.startswith('0xfe00', end=-40))
  3114. self.assertFalse(s.startswith('0xfe00', end=-41))
  3115. # endswith
  3116. self.assertTrue(s.endswith('0x00fe', start=-16))
  3117. self.assertFalse(s.endswith('0x00fe', start=-15))
  3118. self.assertFalse(s.endswith('0x00fe', end=-1))
  3119. self.assertTrue(s.endswith('0x00f', end=-4))
  3120. # replace
  3121. s.replace('0xfe', '', end=-1)
  3122. self.assertEqual(s, '0x00121200fe')
  3123. s.replace('0x00', '', start=-24)
  3124. self.assertEqual(s, '0x001212fe')
  3125. def testRotateStartAndEnd(self):
  3126. a = BitStream('0b110100001')
  3127. a.rol(1, 3, 6)
  3128. self.assertEqual(a, '0b110001001')
  3129. a.ror(1, start=-4)
  3130. self.assertEqual(a, '0b110001100')
  3131. a.rol(202, end=-5)
  3132. self.assertEqual(a, '0b001101100')
  3133. a.ror(3, end=4)
  3134. self.assertEqual(a, '0b011001100')
  3135. self.assertRaises(ValueError, a.rol, 5, start=-4, end=-6)
  3136. def testByteSwapInt(self):
  3137. s = pack('5*uintle:16', *range(10, 15))
  3138. self.assertEqual(list(range(10, 15)), s.unpack('5*uintle:16'))
  3139. swaps = s.byteswap(2)
  3140. self.assertEqual(list(range(10, 15)), s.unpack('5*uintbe:16'))
  3141. self.assertEqual(swaps, 5)
  3142. s = BitStream('0xf234567f')
  3143. swaps = s.byteswap(1, start=4)
  3144. self.assertEqual(swaps, 3)
  3145. self.assertEqual(s, '0xf234567f')
  3146. s.byteswap(2, start=4)
  3147. self.assertEqual(s, '0xf452367f')
  3148. s.byteswap(2, start=4, end=-4)
  3149. self.assertEqual(s, '0xf234567f')
  3150. s.byteswap(3)
  3151. self.assertEqual(s, '0x5634f27f')
  3152. s.byteswap(2, repeat=False)
  3153. self.assertEqual(s, '0x3456f27f')
  3154. swaps = s.byteswap(5)
  3155. self.assertEqual(swaps, 0)
  3156. swaps = s.byteswap(4, repeat=False)
  3157. self.assertEqual(swaps, 1)
  3158. self.assertEqual(s, '0x7ff25634')
  3159. def testByteSwapPackCode(self):
  3160. s = BitStream('0x0011223344556677')
  3161. swaps = s.byteswap('b')
  3162. self.assertEqual(s, '0x0011223344556677')
  3163. self.assertEqual(swaps, 8)
  3164. swaps = s.byteswap('>3h', repeat=False)
  3165. self.assertEqual(s, '0x1100332255446677')
  3166. self.assertEqual(swaps, 1)
  3167. def testByteSwapIterable(self):
  3168. s = BitStream('0x0011223344556677')
  3169. swaps = s.byteswap(range(1, 4), repeat=False)
  3170. self.assertEqual(swaps, 1)
  3171. self.assertEqual(s, '0x0022115544336677')
  3172. swaps = s.byteswap([2], start=8)
  3173. self.assertEqual(s, '0x0011224455663377')
  3174. self.assertEqual(3, swaps)
  3175. swaps = s.byteswap([2, 3], start=4)
  3176. self.assertEqual(swaps, 1)
  3177. self.assertEqual(s, '0x0120156452463377')
  3178. def testByteSwapErrors(self):
  3179. s = BitStream('0x0011223344556677')
  3180. self.assertRaises(ValueError, s.byteswap, 'z')
  3181. self.assertRaises(ValueError, s.byteswap, -1)
  3182. self.assertRaises(ValueError, s.byteswap, [-1])
  3183. self.assertRaises(ValueError, s.byteswap, [1, 'e'])
  3184. self.assertRaises(ValueError, s.byteswap, '!h')
  3185. self.assertRaises(ValueError, s.byteswap, 2, start=-1000)
  3186. self.assertRaises(TypeError, s.byteswap, 5.4)
  3187. def testByteSwapFromFile(self):
  3188. s = BitStream(filename='smalltestfile')
  3189. swaps = s.byteswap('2bh')
  3190. self.assertEqual(s, '0x0123674589abefcd')
  3191. self.assertEqual(swaps, 2)
  3192. def testBracketExpander(self):
  3193. be = bitstring.expand_brackets
  3194. self.assertEqual(be('hello'), 'hello')
  3195. self.assertEqual(be('(hello)'), 'hello')
  3196. self.assertEqual(be('1*(hello)'), 'hello')
  3197. self.assertEqual(be('2*(hello)'), 'hello,hello')
  3198. self.assertEqual(be('1*(a, b)'), 'a,b')
  3199. self.assertEqual(be('2*(a, b)'), 'a,b,a,b')
  3200. self.assertEqual(be('2*(a), 3*(b)'), 'a,a,b,b,b')
  3201. self.assertEqual(be('2*(a, b, 3*(c, d), e)'), 'a,b,c,d,c,d,c,d,e,a,b,c,d,c,d,c,d,e')
  3202. def testBracketTokens(self):
  3203. s = BitStream('3*(0x0, 0b1)')
  3204. self.assertEqual(s, '0x0, 0b1, 0x0, 0b1, 0x0, 0b1')
  3205. s = pack('2*(uint:12, 3*(7, 6))', *range(3, 17))
  3206. a = s.unpack('12, 7, 6, 7, 6, 7, 6, 12, 7, 6, 7, 6, 7, 6')
  3207. self.assertEqual(a, list(range(3, 17)))
  3208. b = s.unpack('2*(12,3*(7,6))')
  3209. self.assertEqual(a, b)
  3210. def testPackCodeDicts(self):
  3211. self.assertEqual(sorted(bitstring.REPLACEMENTS_BE.keys()),
  3212. sorted(bitstring.REPLACEMENTS_LE.keys()))
  3213. self.assertEqual(sorted(bitstring.REPLACEMENTS_BE.keys()),
  3214. sorted(bitstring.PACK_CODE_SIZE.keys()))
  3215. for key in bitstring.PACK_CODE_SIZE:
  3216. be = pack(bitstring.REPLACEMENTS_BE[key], 0)
  3217. le = pack(bitstring.REPLACEMENTS_LE[key], 0)
  3218. self.assertEqual(be.len, bitstring.PACK_CODE_SIZE[key] * 8)
  3219. self.assertEqual(le.len, be.len)
  3220. # These tests don't compile for Python 3, so they're commented out to save me stress.
  3221. #def testUnicode(self):
  3222. #a = ConstBitStream(u'uint:12=34')
  3223. #self.assertEqual(a.uint, 34)
  3224. #a += u'0xfe'
  3225. #self.assertEqual(a[12:], '0xfe')
  3226. #a = BitStream('0x1122')
  3227. #c = a.byteswap(u'h')
  3228. #self.assertEqual(c, 1)
  3229. #self.assertEqual(a, u'0x2211')
  3230. #def testLongInt(self):
  3231. #a = BitStream(4L)
  3232. #self.assertEqual(a, '0b0000')
  3233. #a[1:3] = -1L
  3234. #self.assertEqual(a, '0b0110')
  3235. #a[0] = 1L
  3236. #self.assertEqual(a, '0b1110')
  3237. #a *= 4L
  3238. #self.assertEqual(a, '0xeeee')
  3239. #c = a.byteswap(2L)
  3240. #self.assertEqual(c, 1)
  3241. #a = BitStream('0x11223344')
  3242. #a.byteswap([1, 2L])
  3243. #self.assertEqual(a, '0x11332244')
  3244. #b = a*2L
  3245. #self.assertEqual(b, '0x1133224411332244')
  3246. #s = pack('uint:12', 46L)
  3247. #self.assertEqual(s.uint, 46)
  3248. class UnpackWithDict(unittest.TestCase):
  3249. def testLengthKeywords(self):
  3250. a = ConstBitStream('2*13=100, 0b111')
  3251. x, y, z = a.unpack('n, uint:m, bin:q', n=13, m=13, q=3)
  3252. self.assertEqual(x, 100)
  3253. self.assertEqual(y, 100)
  3254. self.assertEqual(z, '111')
  3255. def testLengthKeywordsWithStretch(self):
  3256. a = ConstBitStream('0xff, 0b000, 0xf')
  3257. x, y, z = a.unpack('hex:a, bin, hex:b', a=8, b=4)
  3258. self.assertEqual(y, '000')
  3259. def testUnusedKeyword(self):
  3260. a = ConstBitStream('0b110')
  3261. x, = a.unpack('bin:3', notused=33)
  3262. self.assertEqual(x, '110')
  3263. def testLengthKeywordErrors(self):
  3264. a = pack('uint:p=33', p=12)
  3265. self.assertRaises(ValueError, a.unpack, 'uint:p')
  3266. self.assertRaises(ValueError, a.unpack, 'uint:p', p='a_string')
  3267. class ReadWithDict(unittest.TestCase):
  3268. def testLengthKeywords(self):
  3269. s = BitStream('0x0102')
  3270. x, y = s.readlist('a, hex:b', a=8, b=4)
  3271. self.assertEqual((x, y), (1, '0'))
  3272. self.assertEqual(s.pos, 12)
  3273. def testBytesKeywordProblem(self):
  3274. s = BitStream('0x01')
  3275. x, = s.unpack('bytes:a', a=1)
  3276. self.assertEqual(x, b'\x01')
  3277. s = BitStream('0x000ff00a')
  3278. x, y, z = s.unpack('12, bytes:x, bits', x=2)
  3279. self.assertEqual((x, y, z), (0, b'\xff\x00', '0xa'))
  3280. class PeekWithDict(unittest.TestCase):
  3281. def testLengthKeywords(self):
  3282. s = BitStream('0x0102')
  3283. x, y = s.peeklist('a, hex:b', a=8, b=4)
  3284. self.assertEqual((x, y), (1, '0'))
  3285. self.assertEqual(s.pos, 0)
  3286. ##class Miscellany(unittest.TestCase):
  3287. ##
  3288. ## def testNumpyInt(self):
  3289. ## try:
  3290. ## import numpy
  3291. ## a = ConstBitStream(uint=numpy.uint8(5), length=3)
  3292. ## self.assertEqual(a.uint, 5)
  3293. ## except ImportError:
  3294. ## # Not to worry
  3295. ## pass
  3296. class BoolToken(unittest.TestCase):
  3297. def testInterpretation(self):
  3298. a = ConstBitStream('0b1')
  3299. self.assertEqual(a.bool, True)
  3300. self.assertEqual(a.read('bool'), True)
  3301. self.assertEqual(a.unpack('bool')[0], True)
  3302. b = ConstBitStream('0b0')
  3303. self.assertEqual(b.bool, False)
  3304. self.assertEqual(b.peek('bool'), False)
  3305. self.assertEqual(b.unpack('bool')[0], False)
  3306. def testPack(self):
  3307. a = pack('bool=True')
  3308. b = pack('bool=False')
  3309. self.assertEqual(a.bool, True)
  3310. self.assertEqual(b.bool, False)
  3311. c = pack('4*bool', False, True, 'False', 'True')
  3312. self.assertEqual(c, '0b0101')
  3313. def testAssignment(self):
  3314. a = BitStream()
  3315. a.bool = True
  3316. self.assertEqual(a.bool, True)
  3317. a.hex = 'ee'
  3318. a.bool = False
  3319. self.assertEqual(a.bool, False)
  3320. a.bool = 'False'
  3321. self.assertEqual(a.bool, False)
  3322. a.bool = 'True'
  3323. self.assertEqual(a.bool, True)
  3324. a.bool = 0
  3325. self.assertEqual(a.bool, False)
  3326. a.bool = 1
  3327. self.assertEqual(a.bool, True)
  3328. def testErrors(self):
  3329. self.assertRaises(bitstring.CreationError, pack, 'bool', 'hello')
  3330. self.assertRaises(bitstring.CreationError, pack, 'bool=true')
  3331. self.assertRaises(bitstring.CreationError, pack, 'True')
  3332. self.assertRaises(bitstring.CreationError, pack, 'bool', 2)
  3333. a = BitStream('0b11')
  3334. self.assertRaises(bitstring.InterpretError, a._getbool)
  3335. b = BitStream()
  3336. self.assertRaises(bitstring.InterpretError, a._getbool)
  3337. self.assertRaises(bitstring.CreationError, a._setbool, 'false')
  3338. def testLengthWithBoolRead(self):
  3339. a = ConstBitStream('0xf')
  3340. self.assertRaises(ValueError, a.read, 'bool:0')
  3341. self.assertRaises(ValueError, a.read, 'bool:1')
  3342. self.assertRaises(ValueError, a.read, 'bool:2')
  3343. class ReadWithIntegers(unittest.TestCase):
  3344. def testReadInt(self):
  3345. a = ConstBitStream('0xffeedd')
  3346. b = a.read(8)
  3347. self.assertEqual(b.hex, 'ff')
  3348. self.assertEqual(a.pos, 8)
  3349. b = a.peek(8)
  3350. self.assertEqual(b.hex, 'ee')
  3351. self.assertEqual(a.pos, 8)
  3352. b = a.peek(1)
  3353. self.assertEqual(b, '0b1')
  3354. b = a.read(1)
  3355. self.assertEqual(b, '0b1')
  3356. def testReadIntList(self):
  3357. a = ConstBitStream('0xab, 0b110')
  3358. b, c = a.readlist([8, 3])
  3359. self.assertEqual(b.hex, 'ab')
  3360. self.assertEqual(c.bin, '110')
  3361. class FileReadingStrategy(unittest.TestCase):
  3362. def testBitStreamIsAlwaysRead(self):
  3363. a = BitStream(filename='smalltestfile')
  3364. self.assertTrue(isinstance(a._datastore, bitstring.ByteStore))
  3365. f = open('smalltestfile', 'rb')
  3366. b = BitStream(f)
  3367. self.assertTrue(isinstance(b._datastore, bitstring.ByteStore))
  3368. def testBitsIsNeverRead(self):
  3369. a = ConstBitStream(filename='smalltestfile')
  3370. self.assertTrue(isinstance(a._datastore._rawarray, bitstring.MmapByteArray))
  3371. f = open('smalltestfile', 'rb')
  3372. b = ConstBitStream(f)
  3373. self.assertTrue(isinstance(b._datastore._rawarray, bitstring.MmapByteArray))
  3374. class Count(unittest.TestCase):
  3375. def testCount(self):
  3376. a = ConstBitStream('0xf0f')
  3377. self.assertEqual(a.count(True), 8)
  3378. self.assertEqual(a.count(False), 4)
  3379. b = BitStream()
  3380. self.assertEqual(b.count(True), 0)
  3381. self.assertEqual(b.count(False), 0)
  3382. def testCountWithOffsetData(self):
  3383. a = ConstBitStream('0xff0120ff')
  3384. b = a[1:-1]
  3385. self.assertEqual(b.count(1), 16)
  3386. self.assertEqual(b.count(0), 14)
  3387. class ZeroBitReads(unittest.TestCase):
  3388. def testInteger(self):
  3389. a = ConstBitStream('0x123456')
  3390. self.assertRaises(bitstring.InterpretError, a.read, 'uint:0')
  3391. self.assertRaises(bitstring.InterpretError, a.read, 'float:0')
  3392. #class EfficientBitsCopies(unittest.TestCase):
  3393. #
  3394. # def testBitsCopy(self):
  3395. # a = ConstBitStream('0xff')
  3396. # b = ConstBitStream(a)
  3397. # c = a[:]
  3398. # d = copy.copy(a)
  3399. # self.assertTrue(a._datastore is b._datastore)
  3400. # self.assertTrue(a._datastore is c._datastore)
  3401. # self.assertTrue(a._datastore is d._datastore)
  3402. class InitialiseFromBytes(unittest.TestCase):
  3403. def testBytesBehaviour(self):
  3404. a = ConstBitStream(b'uint:5=2')
  3405. b = ConstBitStream(b'')
  3406. c = ConstBitStream(bytes=b'uint:5=2')
  3407. if b'' == '':
  3408. # Python 2
  3409. self.assertEqual(a, 'uint:5=2')
  3410. self.assertFalse(b)
  3411. self.assertEqual(c.bytes, b'uint:5=2')
  3412. else:
  3413. self.assertEqual(a.bytes, b'uint:5=2')
  3414. self.assertFalse(b)
  3415. self.assertEqual(c, b'uint:5=2')
  3416. def testBytearrayBehaviour(self):
  3417. a = ConstBitStream(bytearray(b'uint:5=2'))
  3418. b = ConstBitStream(bytearray(4))
  3419. c = ConstBitStream(bytes=bytearray(b'uint:5=2'))
  3420. self.assertEqual(a.bytes, b'uint:5=2')
  3421. self.assertEqual(b, '0x00000000')
  3422. self.assertEqual(c.bytes, b'uint:5=2')
  3423. class CoverageCompletionTests(unittest.TestCase):
  3424. def testUeReadError(self):
  3425. s = ConstBitStream('0b000000001')
  3426. self.assertRaises(bitstring.ReadError, s.read, 'ue')
  3427. def testOverwriteWithSelf(self):
  3428. s = BitStream('0b1101')
  3429. s.overwrite(s)
  3430. self.assertEqual(s, '0b1101')
  3431. class Subclassing(unittest.TestCase):
  3432. def testIsInstance(self):
  3433. class SubBits(BitStream): pass
  3434. a = SubBits()
  3435. self.assertTrue(isinstance(a, SubBits))
  3436. def testClassType(self):
  3437. class SubBits(BitStream): pass
  3438. self.assertEqual(SubBits().__class__, SubBits)
  3439. class BytesProblems(unittest.TestCase):
  3440. def testOffsetButNoLength(self):
  3441. b = BitStream(bytes=b'\x00\xaa', offset=8)
  3442. self.assertEqual(b.hex, 'aa')
  3443. b = BitStream(bytes=b'\x00\xaa', offset=4)
  3444. self.assertEqual(b.hex, '0aa')
  3445. def testInvert(self):
  3446. b = BitStream(bytes=b'\x00\xaa', offset=8, length=8)
  3447. self.assertEqual(b.hex, 'aa')
  3448. b.invert()
  3449. self.assertEqual(b.hex, '55')
  3450. def testPrepend(self):
  3451. b = BitStream(bytes=b'\xaa\xbb', offset=8, length=4)
  3452. self.assertEqual(b.hex, 'b')
  3453. b.prepend('0xe')
  3454. self.assertEqual(b.hex, 'eb')
  3455. b = BitStream(bytes=b'\x00\xaa', offset=8, length=8)
  3456. b.prepend('0xee')
  3457. self.assertEqual(b.hex, 'eeaa')
  3458. def testByteSwap(self):
  3459. b = BitStream(bytes=b'\x01\x02\x03\x04', offset=8)
  3460. b.byteswap()
  3461. self.assertEqual(b, '0x040302')
  3462. def testBinProperty(self):
  3463. b = BitStream(bytes=b'\x00\xaa', offset=8, length=4)
  3464. self.assertEqual(b.bin, '1010')