ハフマン エンコーディング文字列をバイナリ python に変換する方法に問題があります。
この質問には、ハフマン アルゴリズムは関係ありません。
次のようになります。
エンコードされたハフマン文字列を取得できます01010101010
。注、これは文字列です。
しかし今、文字列表現を実際のバイナリに保存したいと考えています。
ハフマンでエンコードされた文字列では、すべての 0 と 1 がbyteです。
私が欲しいのは、すべての 0 と 1 が少しです。
どうすればPythonでそれを行うことができますか?
編集1:
私の問題を十分に明確に説明していないことを許してください。
0 と 1 を 2 進数に書き込む現在のアプローチについて説明します。
たとえば、文字列 s='010101010' をコード化できます。
- 私は
int
それを整数に変換するために使用します - 次に
unichr
、それを文字列に変換して、ファイルに書き込むことができるようにします - 文字列をバイナリモードでファイルに書き込みます
また、ハフマン コードをデコードするには、ファイルを読み取る必要があります。
だから私のアプローチは、
- ファイルからバイトを読み取る
- それらをintに戻します
- int をバイナリ表現文字列に変換します。
- 文字列をデコードする
そして、ステップ 2で問題が発生し、私は無知になりました。
一部のハフマン文字列は短く ( のように10
)、一部は長く ( 010101010101001
) になる可能性があります。これにより、int値のバイト長が異なります(短い文字列には1バイトしかかからないものもあれば、長い文字列には2バイト以上かかるものもあります)
次のコードは、私の問題を示しています。
ss=['010101','10010101010']
# first one is short and takes only one byte in its int value
# second one is long and takes two bytes
print 'write it to file'
with open('binary.bin','wb') as f:
for s in ss:
n=int(s,2)
print n
s=unichr(n)
f.write(s)
print 'read it to file'
with open('binary.bin','rb') as f:
for s in f.read():
print ord(s)
一部で秒単位で1 バイトずつ読み込んでいますが、これは実際には正しくありません。文字列10010101010
は 2 バイトを占めるためです。
ファイルからそれらのバイトを読み取るとき、一度に何バイトを読み取る必要がありますか?