2016-03-19 4 views
1

Ich habe 4 Variable zwischen 0~0x1FF(9-bit) und 1 Variable zwischen 0~0xF(4-bit) und ich möchte sie in Binärdatei packen. Wie üblich werde ich die ersten vier mit pack('H', var) (unsigned kurz, 16-Bit) packen, dann packen Sie die letzte mit pack('B', var) (unsigned char, 8-bit).wie 4 4-Bit-int-Variable in 5 8-Bit-Variable in Python packen?

so werde ich kosten 72 bits:

16 * 4 + 8 = 72 

ich eine besondere Situation bin vor: meine Lagerung sehr, sehr wertvoll ist, ich brauche nur 40 Bits:

4 * 9 + 1 * 4 

I 32 Bits vergeuden, und auch diese 32 bit können mir wichtig sein, da ich viele daten packen muss, jedes mal wenn ich 32 bits verschleudere, beschwert sich mein speicher endlich bei mir.

In der Tat kann ich 4 9-Bit-Variable und 1 4-Bit-Variable in 5 8-Bit-Variable (unsigned char) ändern, dann packe ich sie alle mit pack('B', var), natürlich speichere ich 32 Bits.

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

Wie kann ich einfach Pack 4 9-Bit-Variable und 1 4-Bit-Variable int 5 8-Bit-Variable ändern?

+0

1) Keine Spam-Tags! Dies hängt nicht mit C zusammen. 2) Verwenden Sie Bitops. – Olaf

Antwort

2

Packen sie selbst:

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)) 

Ausgang:

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

Beachten Sie, dass ? ASCII für \x3f ist.

+0

Ich glaube nicht, dass es direkt mit 'pack' machbar ist, ohne den Shift- und Additionsprozess zu durchlaufen, den du in die' for' -Schleife gelegt hast? ... Ich versuche nur, einen Weg dafür zu finden ... : P ... aber trotzdem, große Antwort +1 –