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
はユニコード型と仲良くしています。ここで、すべての文字列 (、、...) を から抽出する必要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 では機能しません。以来、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