python中的ID3v1空字节解析

python中的ID3v1空字节解析,python,byte,id3,id3-tag,Python,Byte,Id3,Id3 Tag,我正在编写一个工具来解析文件中的ID3标记,并以GUI方式编辑它们。到目前为止,一切都很好。但是,我试图在显示信息时删除空字节终止符,然后在用户保存信息时将其添加回以保留ID3v1格式。然而,当检查空终止符时,我什么也得不到 这是与标签手柄相关的代码部分: if(bytes.decode(check) == "TAG"): title = self.__clean(bytes.decode(f.read(30))) arti

我正在编写一个工具来解析文件中的ID3标记,并以GUI方式编辑它们。到目前为止,一切都很好。但是,我试图在显示信息时删除空字节终止符,然后在用户保存信息时将其添加回以保留ID3v1格式。然而,当检查空终止符时,我什么也得不到

这是与标签手柄相关的代码部分:

            if(bytes.decode(check) == "TAG"):
            title = self.__clean(bytes.decode(f.read(30)))
            artist = self.__clean(bytes.decode(f.read(30)))
            album = self.__clean(bytes.decode(f.read(30)))
            year = bytes.decode(f.read(4))
            comment = self.__clean(bytes.decode(f.read(30)))
            tmp_gen = bytes.decode(f.read(1))
            genre = self.__clean(Utils.genreByteToString(tmp_gen))
            return TagV1(title, artist, album, year, comment, genre)
        return None
清洁方法如下:

    def __clean(self, string):
    counter = 0
    for i in range(0, len(string)):
        w = string[i]
        if(not w.strip()) or b"\00" == w or w == b"00" or w == bytes.decode(b"\00"):
            counter+=1
        else:
            counter = 0
        if(counter == 2):
            return string[0:i-1]
    return string
我尝试了所有可能的组合,知道空字节。要么不是w,要么不是w.split,我甚至试着把它放在字节中,然后循环thorught表示空字节,但仍然没有。我的计数器在调试器上始终保持为0。此外,当尝试从调试器复制值时,它显示为这是一个空白。在调试器中,它显示为一个空正方形。我将非常感谢您的意见


使用PyChar 2017 1.4,我发现唯一有效的解决方案是使用 w==str.decodeb\00或rstrip\0 如Marteen所示

其他一切似乎都不起作用。然而,仍然有一些地方它不起作用。例如,我正在尝试的文件中的注释直到最后一个才有空字节

在用十六进制编辑器进一步检查后,我发现了一些奇怪的字符。注释以十六进制\20字符继续,直到位置29,其中空字符表示其具有轨迹指示器,下一个字符是轨迹的\01。奇怪的是,类型指示器是一个0C,翻译成不能粘贴,它是一个有Cero的盒子


编辑:使用uu clean方法检查解码的空终止符以及w.isspace似乎可以解决其他两种情况下的问题。

?Nevermind rstrip不起作用。我解决了它的问题:您当然需要使用rstrip“\0”,否则它将不起作用。它也起作用,感谢规范要求所有字段都用空字符ASCII 0填充。然而,并不是所有的应用程序都尊重这一点,例如WinAmp,它用ASCII 32填充字段。类型是一个数字字段,它可能具有以下值之一:。。。12“其他”,更多信息-如果不确定,请阅读标准。