麻烦修复binascii奇长字符串问题

时间:2012-05-06 18:50:55

标签: python

我在这里有一个小脚本,我需要一些帮助:

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和十六进制编辑器进行通信。)

我的问题是该行

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

抛出“TypeError:奇数长度字符串”。现在,这已足够描述了。通过调查,我已经确定,当它出现错误时,songbyte的值是8.然而,没有任何意义的是,这个错误发生在列表中的37首歌曲,以及其他歌曲的大多数歌曲也是8 - 并且被我的len(str(songbyte))&lt; 2检查哪个添加0 - 但奇怪的是这个没有。

虽然我希望,但我不确定这是否足以帮助我解决问题,而不是提供整个脚本的完整细节,尽管我认为不可能。还有另一种方法可以将songbyte(作为十六进制)写入文件吗?

1 个答案:

答案 0 :(得分: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个以上的字符。