Я пытаюсь декодировать протокол ID3v2 (MP3 header), используя python. Формат данных, подлежащих расшифровке, выглядит следующим образом.Сплит строки ascii/unicode
s1
, s2
... sn-1
являются Unicode (UTF-16/UTF-8) строки, и последняя строка 'зп' может быть Юникода или двоичная строка.
data = s1+delimiters+s2+delimiters+...+sn
Где, разделитель для UTF-16 является '\x00'+'\x00'
и разделителем для UTF-8 является '\x00'
я data
вместе с юникод-типа. Теперь я должен извлечь все струны (s1
, s2
, ... sn
) от data
. Для этого я использую split()
следующим образом,
#!/usr/bin/python
def extractStrings(encoding_type, data):
if(encoding_type == "utf-8"): delimitors = '\x00'
else: delimitors = '\x00'+'\x00'
return data.split(delimitors)
def main():
# Set-1
encoding_type = "utf-8"
delimitors = '\x00'
s1="Hello".encode(encoding_type)
s2="world".encode(encoding_type)
data = s1+delimitors+s2
print extractStrings(encoding_type, data)
# Set-2
encoding_type = "utf-16"
delimitors = '\x00'+'\x00'
s1="Hello".encode(encoding_type)
s2="world".encode(encoding_type)
data = s1+delimitors+s2
print extractStrings(encoding_type, data)
if __name__ == "__main__":
main()
выход:
['Hello', 'world']
['\xff\xfeH\x00e\x00l\x00l\x00o', '\x00\xff\xfew\x00o\x00r\x00l\x00d\x00']
Он работает для набора данных-1, но не работает для набора-2. Так, «данные» в наборе 2-
'\xff\xfeH\x00e\x00l\x00l\x00o\x00\x00\x00\xff\xfew\x00o\x00r\x00l\x00d\x00'
^ ^
имеет дополнительный '\x00'
предшествует разделитель, из-за буквой «0», то его не в состоянии сделать надлежащую работу.
Может ли кто-нибудь помочь мне правильно декодировать «данные» для обоих случаев?
Update:
Постараюсь просто вопрос. s1 = закодирован (UTF-8/UTF-16) Строка
s2 = двоичная строка (не Unicode)
разделитель для UTF-16 '\x00'+'\x00'
, и разделитель для UTF-8 является '\x00'
data = (разделитель s1 +) + s2
Может ли кто-нибудь помочь мне извлечь s1 и s2 из «данных»?
Update2: Решение
Следующий код работает для моего требования,
def splitNullTerminatedEncStrings(self, data, encoding_type, no_of_splits):
data_dec = data.decode(encoding_type, 'ignore')
chunks = data_dec.split('\x00', no_of_splits)
enc_str_lst = []
for data_dec_seg in chunks[:-1]:
enc_str_lst.append(data_dec_seg.encode(encoding_type))
data_dec_chunks = '\x00'.join(chunks[:-1])
if(data_dec_chunks): data_dec_chunks += '\x00'
data_chunks = data_dec_chunks.encode(encoding_type)
data_chunks_len = len(data_chunks)
enc_str_lst.append(data[data_chunks_len:]) # last segment
return enc_str_lst
извините забыл упомянуть, последняя строка (зп) не может быть строкой unicode. При декодировании кадра APIC (альбом-арт) sn является двоичной (образной) строкой. – Mohan