簡體   English   中英

如何解碼列表中字節b字符串的任何字符串字段'

[英]How to decode any string fields in a list that are a byte b'string'

將代碼遷移到Python3.6,解壓縮並分配到Python2.6中的列表,因為整個列表是一個字符串,3.6個字符串值表示為字節碼。 任何整數值都在列表中正確表示,但任何字符串字段仍然表示為字節,例如:b'B'

源數據是包含各種消息的二進制文件,具有各種長度,這些消息被成功解壓縮並存儲在列表中

原始字節值示例消息的數據

b'\x07\x88g\xe0b\xe5]\xc5\x00\x01j\xdd\x00\x01\xff\xdcB\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\n\x00\x00\x03\xe8\x00\x00\x02'
Unpacked data - using '>I Q I c I Q i H B' on the raw byte values above
[126380000, 7126205086073711325, 131036, b'B', 1, 10, 1000, 0, 2]

結束狀態:實現一個通用解決方案,它將檢測列表中的任何b'(可以是列表中的任何索引,具體取決於消息)轉換為正常的字符串值。

或者在解壓縮期間不將字符串值存儲為字節碼

Current :  [126380000, 7126205086073711325, 131036, b'B', 1, 10, 1000, 0, 2]
End state: [126380000, 7126205086073711325, 131036, B, 1, 10, 1000, 0, 2]

注意到b'B'應簡單地表示為B.

我搜索了google和stackoverflow以獲得答案,但只查找通用解碼示例。

提前致謝

AFAIK, struct.unpack沒有輸出字符串的格式字符 ,總是以字節為單位。

您可以使用map將每個bytes類型的列表項解碼為字符串。

org = [126380000, 7126205086073711325, 131036, b'B', 1, 10, 1000, 0, 2]
res = list(map(lambda i: i.decode("utf-8") if isinstance(i, bytes) else i, org))

編輯

如建議的那樣,使用列表推導而不是map可能更簡單。

res = [i.decode("utf-8") if isinstance(i, bytes) else i for i in org]

我建議通過List comprehension vs map中的討論來查看何時使用另一個(例如,具有長/大列表的性能,可讀性,有/無lambdas等)。

地圖

        mysetup = "fields = [126380000, 7126205086073711325, 131036, b'B', 1, 10, 1000, 0, 2]"
        mycode = 'fields = list(map(lambda i: i.decode("utf-8") if isinstance(i, bytes) else i, fields))'
        print(timeit.timeit(setup=mysetup, stmt=mycode, number=100000))

時間:0.24705234917252444

列表理解

        mysetup = "fields = [126380000, 7126205086073711325, 131036, b'B', 1, 10, 1000, 0, 2]"
        mycode = 'fields = [i.decode("utf-8") if isinstance(i, bytes) else i for i in fields]'
        print(timeit.timeit(setup=mysetup, stmt=mycode, number=100000))

時間:0.15206540​​00212543

列表理解更快。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM