2017-06-28 34 views
0

我正在編寫一個工具來解析文件中的ID3標籤並以GUI方式編輯它們。到目前爲止,一切都很好。但是,我試圖在顯示信息時刪除空字節終止符,然後在用戶將其保存爲保留ID3v1格式時將其添加回去。然而,當檢查空終止符時,我什麼也得不到。ID3v1在Python中的空字節解析

這是關係到標籤的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

+0

['rstrip'](https://docs.python.org/2/library/string.html#string.rstrip)? –

+0

Nevermind rstrip()沒有工作。我解決了它 – MartinStone

+1

抱歉:您當然需要使用'rstrip('\ 0')',否則它將無法工作。 –

回答

1

我想通了,唯一可行的解​​決辦法是使用 w == str.decode(b"\00")rstrip("\0") 由Marteen

表示一切似乎行不通。但是,仍然有些地方它不起作用。例如,我正在嘗試的文件中的註釋直到最後一個都沒有空字節。

用十六進制編輯器進一步檢查時,我發現一些奇怪的字符。註釋繼續執行\20字符(十六進制),直到位置爲29的空字符(用於表示它具有軌跡指示符),則該軌道的下一個字符爲\01。奇怪的流派指標是0C這意味着(不能粘貼它,它是一個盒子裏面有ceros)。

編輯:使用__clean()方法檢查解碼的空終止符以及w.isspace()似乎解決了在其他兩種情況下的問題。

+1

「規範要求所有字段都填充空字符(ASCII 0)。但是,並非所有的應用都尊重這個(**示例是WinAmp,它填充字段,ASCII 32 **)。 「和「**流派是一個數字字段**,它可能具有以下值之一:... 12'其他'...」,更多信息[here](http://mpgedit.org/mpgedit/mpeg_format/ mpeghdr.htm#MPEGTAG) - 如果不確定*閱讀標準*。 –