我想解码使用python的ID3v2(MP3标头)协议。要解码的数据格式如下。分割ascii/unicode字符串
s1
,s2
,... sn-1
是个Unicode(UTF-16/UTF-8)的字符串,和最后一个字符串 'SN' 可以是Unicode或二进制字符串。
data = s1+delimiters+s2+delimiters+...+sn
其中,分隔符为UTF-16是'\x00'+'\x00'
和分隔符为UTF-8是'\x00'
我得到data
使用Unicode型一起。现在我必须从data
中提取所有字符串(s1
,s2
,... sn
)。对于这个我使用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数据但SET-2不工作。 因为在SET-2
'\xff\xfeH\x00e\x00l\x00l\x00o\x00\x00\x00\xff\xfew\x00o\x00r\x00l\x00d\x00'
^ ^
“数据”有一个额外的'\x00'
之前分隔符,由于字母“0”,它不能做一个适当的工作。
任何人都可以帮助我正确解码'数据'两种情况?
更新:
我会尽量简单的问题。 S1 =编码(UTF-8/UTF-16)串
S2 =二进制串(不是Unicode)
定界符对于UTF-16是'\x00'+'\x00'
,和定界符对于UTF-8是'\x00'
data =(s1 + delimiter)+ s2
任何人都可以帮助我从'data'中提取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
对不起忘了提,最后一个字符串(SN )可能不是一个unicode字符串。在解码APIC(专辑艺术)帧时,sn是二进制(图像)字符串。 – Mohan 2013-04-24 18:10:09