ID3v1在python中解析Null Byte

时间:2017-06-28 00:55:59

标签: python byte id3 id3-tag

我正在编写一个工具来解析文件中的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

我已经尝试了所有可能的组合知道空字节。 not wnot w.split()我甚至尝试将其放入字节中,然后循环搜索空字节但仍然没有。我的计数器在调试器上总是保持0。此外,当尝试从调试器复制值时,它显示为此,这是一个空白区域。在调试器中,它显示为空方块。我很感激输入。

使用PyChar 2017 1.4

1 个答案:

答案 0 :(得分:1)

我发现唯一有效的解决方案是使用 w == str.decode(b"\00")rstrip("\0") 由Marteen表示

其他一切似乎都行不通。但是仍有一些地方不起作用。例如,我正在尝试的文件中的注释在最后一个文件之前没有空字节。

使用十六进制编辑器进一步检查后,我发现了一些奇怪的字符。注释继续使用十六进制中的\20字符,直到位置29为空字符(表示它具有轨道指示符),下一个字符为轨道的\01。奇怪的是,类型指示符是0C,转换为(不能粘贴它,它是一个带有“ceros”的框)。

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