我在这里有一个小脚本,我需要一些帮助:
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(作为十六进制)写入文件吗?
答案 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个以上的字符。