2016-03-19 1 views
1

J'ai 4 variable entre 0~0x1FF(9-bit) et 1 variable entre 0~0xF(4-bit) et je veux les emballer en binaire. Comme d'habitude, je vais empaqueter les quatre premiers avec pack('H', var) (non signé court, 16 bits), puis emballer le dernier avec (unsigned char, 8 bits).comment emballer 4 à 9 bits et une variable d'int 4 bits en 5 variable python 8-bit?

donc je Coûtera 72 bits:

16 * 4 + 8 = 72 

Je suis face à une situation particulière: mon stockage est très précieux, j'ai juste besoin de 40 bits:

4 * 9 + 1 * 4 

je gaspille 32 bits, et ces 32 bits peut être important pour moi, parce que j'ai beaucoup de données à emballer, chaque fois que je perds 32 bits, enfin, mon stockage se plaint à moi.

En fait, je peux changer 4 variables de 9 bits et 1 variable de 4 bits en 5 variables de 8 bits (char signé), puis je les empaquette tous avec , bien sûr, j'enregistre 32 bits.

4 * 9 + 1 * 4 == 5 * 8 

Comment puis-je changer simplement Pack 4 variable et 1 variable de type int 5 Variable 8 bits 4 bits 9 bits?

+0

1) Ne pas les balises de spam! Ceci n'est pas lié à C. 2) Utilise les bitops. – Olaf

Répondre

2

Emballez-vous:

import struct 
ninebits = [0b110011001,0b000000000,0b111111111,0b010101010] 
fourbit = 0b1010 
pack = 0 
for i,v in enumerate(ninebits): 
    pack <<= 9 
    pack |= v 
pack <<= 4 
pack |= fourbit 
print('{:040b}'.format(pack)) 
print('{:010X}'.format(pack)) 
print(struct.pack('>LB',pack >> 8, pack & 0xFF)) 

Sortie:

1100110010000000001111111110101010101010 
CC803FEAAA 
b'\xcc\x80?\xea\xaa' 

Notez que ? est ASCII pour \x3f.

+0

Je ne pense pas que ce soit faisable directement avec 'pak' sans passer par le changement et le processus en ajoutant que vous mettez dans la boucle' for'? ... Je suis juste essayer de trouver un moyen pour que ... : P ... mais néanmoins, bonne réponse +1 –