2017-04-30 6 views
0

Pour le code suivant a et c ne sont pas comparables. Même s'ils sont logiquement les mêmes.Comment extraire bitarray de sa représentation par octet de la bitarray dans le format original

Ici, a n'est pas égal à c puisqu'ils ont une longueur différente? Comment surmonter ce problème de manière efficace?

from bitarray import bitarray 

a = bitarray('1', endian="little") * 5 
b = a.tobytes() 
c = bitarray(endian='little') 
c.frombytes(b) 

print(a == c) 
+1

Chers amis, s'il vous plaît, arrêtez de vous poser des questions sur la manière «la plus efficace». Je vous remercie. –

+1

Surmontez comment? Ils sont différents. Vous devrez probablement spécifier ce que vous essayez d'accomplir. –

+0

Comment pourraient-ils être égaux s'ils ont des longueurs différentes? – martineau

Répondre

1

Si c'est le BitArray 0,8 de https://pypi.python.org/pypi/bitarray/

  • tobytes ne conserve pas la longueur en bits
  • et donc frombytes créent toujours une BitArray de longueur = n * 8

Solutions de contournement

  • la solution de contournement la plus simple serait d'étendre la taille des deux tableaux à un multiple de 8. Il n'y a pas une telle opération
  • la deuxième solution la plus indolore est l'exécution d'une paire tobytes-bybytes sur les deux tableaux avant la comparaison. De cette façon, leur longueur deviendra un multiple de 8
  • alternativement déballer et emballer préserver probablement la longueur exacte, juste qu'ils utilisent 1 octet pour représenter 1 bit

Pour autant que je vérifié la mise en œuvre actuelle suppose toujours que la le contenu de deux bitarrays est différent si leur longueur diffère. Même bitdiff commence par une telle vérification, alors que l'on pourrait supposer que le tableau le plus court est virtuellement étendu avec 0-s pour une telle comparaison.

EDIT: L'extension sur place est peut-être possible. Je ne peux pas dire s'il est bon code Python ou non, mais quelque chose comme cela peut fonctionner:

a.extend(max(0, c.length()-a.length()) * bitarray([False])) 
c.extend(max(0, a.length()-c.length()) * bitarray([False])) 

Dans mon imagination en exécutant ces lignes la BitArray plus courte est étendu avec 0-s et ont une longueur égale à la autre bitarray. En pratique, je n'ai aucune idée de la façon dont le 0*bitarray([False]) se comporte et ne peut pas le tester maintenant. Si elle se comporte mal, une

traditionnelle
if c.length()<a.length(): c.extend(a.length()-c.length()) * bitarray([False]) 
elif a.length()<c.length(): a.extend(c.length()-a.length()) * bitarray([False]) 

peut faire en sorte que 0*bitarray([False]) ne se produit jamais.