与this问题类似,我试图读取ID3v2标记头,并且无法弄清楚如何在python中获取单个字节。
我首先将所有十个字节读入一个字符串。然后我想解析各个信息。
我可以在字符串中获取两个版本号字符,但后来我不知道如何获取这两个字符并从中获取整数。
struct包似乎是我想要的,但我无法让它工作。
这是我的代码到目前为止(我对python btw很新...所以请放轻松我):
def __init__(self, ten_byte_string):
self.whole_string = ten_byte_string
self.file_identifier = self.whole_string[:3]
self.major_version = struct.pack('x', self.whole_string[3:4]) #this
self.minor_version = struct.pack('x', self.whole_string[4:5]) # and this
self.flags = self.whole_string[5:6]
self.len = self.whole_string[6:10]
打印出任何值,除非明显是废话,因为它们格式不正确。
答案 0 :(得分:16)
如果您有一个字符串,您希望将其解释为16位整数,则可以通过以下方式执行此操作:
>>> s = '\0\x02'
>>> struct.unpack('>H', s)
(2,)
请注意>是big-endian(整数的最大部分是第一个)。这是id3标签使用的格式。
对于其他大小的整数,您使用不同的格式代码。例如。 “i”表示有符号的32位整数。有关详细信息,请参阅help(struct)。
您也可以一次解压几个元素。例如,对于2个无符号短路,后跟有符号的32位值:
>>> a,b,c = struct.unpack('>HHi', some_string)
按照您的代码,您正在寻找(按顺序):
此格式字符串为:
ident, major, minor, flags, len = struct.unpack('>3sBBBI', ten_byte_string)
答案 1 :(得分:4)
答案 2 :(得分:2)
我打算推荐struct
包,但之后你说你已经尝试过了。试试这个:
self.major_version = struct.unpack('H', self.whole_string[3:5])
pack()
函数将Python数据类型转换为位,unpack()
函数将位转换为Python数据类型。
答案 3 :(得分:2)
我正在尝试读取ID3v2标记标题
FWIW,这里有already a module。