我正在尝试使用 python 解码 ID3v2 (MP3 header) 协议。要解码的数据格式如下。
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-type 相处融洽。现在我必须从中提取所有字符串(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']
它适用于 set-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'
数据 = (s1+分隔符)+s2
谁能帮我从“数据”中提取 s1 和 s2 吗?
更新2:解决方案
以下代码适用于我的要求,
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