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 首歌曲的列表

我需要编写歌曲字节——它的值范围从 8 到 72。目前我只是迭代并确保它对每个歌曲字节都有正确的值(它是一个已知正确播放列表的副本,验证通过 diff 和十六进制编辑器)。

我的问题是这条线

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

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

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

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 回答