python中的ID3v1空字节解析

Posted

技术标签:

【中文标题】python中的ID3v1空字节解析【英文标题】:ID3v1 Null Byte parsing in python 【发布时间】:2017-06-28 00:55:58 【问题描述】:

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

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

            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

【问题讨论】:

rstrip? 没关系 rstrip() 不起作用。我解决了 对不起:你当然需要使用rstrip('\0'),否则将不起作用。 效果也很好,谢谢 【参考方案1】:

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

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

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

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

【讨论】:

"规范要求用​​空字符 (ASCII 0) 填充所有字段。但是,并非所有应用程序都遵守这一点(例如 WinAmp 用 、ASCII 填充字段32)。”和“类型是一个数字字段,它可能具有以下值之一:... 12 'Other' ...”,更多信息here - 如果不确定阅读标准.

以上是关于python中的ID3v1空字节解析的主要内容,如果未能解决你的问题,请参考以下文章

Python Pyramid 捕获空字节攻击

Python 从字符设备读取空字节数组

使用校验和将字节数组转换为字符串。在 python 中重新迭代时获取额外的空字节

空解析器 tika python

为啥返回空字节作为响应?

华为OD机试真题 Python 实现TLV解析