【发布时间】:2013-04-17 17:23:59
【问题描述】:
我正在尝试使用 python 解码 ID3v2(MP3 标头)协议。需要解码的数据格式如下。
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']
它适用于 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 吗?
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 是二进制(图像)字符串。
标签: python unicode split delimiter