我这里有一个小脚本,我需要一些帮助:
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首歌曲中,其他歌曲的大多数songbyte也是8 --并且被我的len(str(songbyte)) <2检查捕获,这添加了一个0 --但奇怪的是这个没有。
虽然我希望,但我真的不确定这是否足够的信息来帮助我解决问题,缺乏完整的细节的整个脚本,虽然我认为我不能。有没有其他方法可以将songbyte --十六进制--写入文件?
发布于 2012-05-07 02:55:22
您应该使用struct.pack,它就是为此目的而设计的:
import struct
for song in songs:
slash = song.rindex('\\')
songbyte = slash + 2
f.write(struct.pack('!B', songbyte))如果您希望使用"{0:02x}",则格式字符串"{0:x}"不会在数字前插入零。
>>> "{0:x}".format(12)
'c'
>>> "{0:02x}".format(12)
'0c'然而,使用binascii会导致不必要的复杂和脆弱的代码。例如,如果值超过255,它将静默生成2个以上的字符。
https://stackoverflow.com/questions/10473234
复制相似问题