2016-03-19 11 views
1

私は0~0x1FF(9-bit)と1の間の変数が0~0xF(4-bit)の間にあり、それらをバイナリにパックしたいと思っています。いつものように、最初の4つをpack('H', var)符号なし短い、16ビット)でパックし、最後のパックをpack('B', var)符号なしの文字列、8ビットの)でパックします。私は32ビットを無駄にPythonの5 8ビット変数に4 9ビットと1 4ビットのint変数をパックする方法は?

4 * 9 + 1 * 4 

、および:私はちょうど40ビットを必要とする、私の記憶は非常に非常に貴重である:私は特別な状況に直面しています

16 * 4 + 8 = 72 

を:

ので、私は​​費用がかかります私が32ビットを無駄にするたびに、たくさんのデータをパックするため、これらの32ビットは私にとって重要なものになります。

実際、4ビットの変数と1の4ビットの変数を5つの8ビット変数(符号なしのchar)に変更することができます。その後、すべてをpack('B', var)でパックします。もちろん32ビットを保存します。

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

どのように私は単にパック4 9ビットの変数と1 4ビットの変数INT 5、8ビットの変数を変更できますか?

+0

1)スパムタグは使用しないでください!これはCとは関係ありません。2)ビットを使用します。 – Olaf

答えて

2

は自分でパック:

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

出力:

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

?\x3fのASCIIであることを。

+0

'for'ループに入れたシフトや追加プロセスを使わずに' pack'を使って直接実行できるとは思いませんか?...私はそのための方法を見つけようとしています... :P ...でもそれにもかかわらず、偉大な答え+1 –

関連する問題