2012-05-06 9 views
2

は私が持ついくつかの助けを必要とすることを、ここで小さなスクリプトを持っています。テスト目的のために、私は49曲を含むものを書いています - 曲は49曲を繰り返してリストしていますトラブル固定binascii奇数の長さの文字列の問題

私はsongbyteを書く必要があります - それは8から72の範囲の値です。現時点では、私はちょうど反復して、それが各songbyteのための正しい値を持っていることを確認しています(これは既知の正しいプレイリストのコピーで、diffと16進エディタを使っています)。

私の問題は、ライン

print(binascii.a2b_hex("{0:x}".format(songbyte))) 

は "例外TypeError:奇数長の文字列を" スローということです。さて、これは十分説明的です。調べることで、私はそれがエラーになるときのsongbyteの値が8であると判断しました。しかし、意味がないのは、このエラーがリストに37曲、他の曲のsongbytesまた8 - そして私のlen(str(songbyte))< 2つのチェックが0を追加すると捕まっていますが、変なことはありません。

私は、私ができるとは思わないが、これが私が問題を解決するのに十分な情報であるかどうかは分かりませんが、スクリプト全体の完全な詳細を提供していません。私がsongbyteを16進数でファイルに書くことができる別の方法はありますか?あなたは、この目的のために、正確に意味するstruct.pack、使用する必要があります

答えて

1

import struct 
for song in songs: 
    slash = song.rindex('\\') 
    songbyte = slash + 2 
    f.write(struct.pack('!B', songbyte)) 

フォーマット文字列"{0:x}"あなたが"{0:02x}"をしたいと思い、番号の前にゼロを挿入しません。

>>> "{0:x}".format(12) 
'c' 
>>> "{0:02x}".format(12) 
'0c' 

しかし、binasciiを使用すると、不必要に複雑で脆いコードになります。たとえば、値が255を超えると、2文字以上は静かに生成されます。

+0

うわー、それはとてもうまく機能しました。私は間違いなく構造体を読み上げます!ありがとうございました。 – src

関連する問題