Skip to main content
 首页 » 编程设计

python之无法修复 binascii 奇数长度字符串问题

2025年05月04日18lexus

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

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)) < 2 检查添加了 0 —— 但奇怪的是这个没有。

虽然我希望,但我不确定这些信息是否足以帮助我解决问题,我认为我无法提供整个脚本的完整详细信息。有没有另一种方法可以将 songbyte —— 作为十六进制 —— 写入文件?

请您参考如下方法:

你应该使用 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 个字符。