首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >修复binascii奇数长度字符串问题

修复binascii奇数长度字符串问题
EN

Stack Overflow用户
提问于 2012-05-07 02:50:55
回答 1查看 3.1K关注 0票数 2

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

代码语言:javascript
复制
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和十六进制编辑器进行验证)。

我的问题是这条线

代码语言:javascript
复制
print(binascii.a2b_hex("{0:x}".format(songbyte)))

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

虽然我希望,但我真的不确定这是否足够的信息来帮助我解决问题,缺乏完整的细节的整个脚本,虽然我认为我不能。有没有其他方法可以将songbyte --十六进制--写入文件?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-05-07 02:55:22

您应该使用struct.pack,它就是为此目的而设计的:

代码语言:javascript
复制
import struct
for song in songs:
    slash = song.rindex('\\')
    songbyte = slash + 2
    f.write(struct.pack('!B', songbyte))

如果您希望使用"{0:02x}",则格式字符串"{0:x}"不会在数字前插入零。

代码语言:javascript
复制
>>> "{0:x}".format(12)
'c'
>>> "{0:02x}".format(12)
'0c'

然而,使用binascii会导致不必要的复杂和脆弱的代码。例如,如果值超过255,它将静默生成2个以上的字符。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10473234

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档