2

ここにいくつかの助けが必要な小さなスクリプトがあります。

for song in songs:
    slash = song.rindex('\\')
    songbyte = slash + 2
    if len(str(songbyte)) < 2:
    #if songbyte < 10:
        songbyte = "0" + str(songbyte)
        f.write(binascii.a2b_hex(songbyte))
    else:
        f.write(binascii.a2b_hex("{0:x}".format(songbyte)))
f.close()
return

まず、プレイリストを作成しようとしています。テスト目的で、49 曲を含むものを書いています。曲は、49 曲を含む反復処理中のリストです。

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

私の問題は、その行です

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

「TypeError: 奇数長の文字列」をスローします。さて、これで十分に説明できます。調査の結果、エラーになるときの songbyte の値は 8 であることがわかりました。ただし、このエラーがリストの 37 曲目で発生し、他の曲の songbytes の大部分がも8です-そして、0を追加する私のlen(str(songbyte)) < 2チェックで捕まります-しかし、奇妙なことに、これはそうではありません。

スクリプト全体の完全な詳細を提供することを除けば、これが問題の解決に役立つ十分な情報であるかどうかはわかりませんが、できるとは思いません。songbyte を 16 進数としてファイルに書き込む別の方法はありますか?

4

1 に答える 1

1

を使用する必要がありますstruct.pack。これは、まさにこの目的のためのものです。

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 文字を超える文字が生成されます。

于 2012-05-06T18:55:22.353 に答える