[英]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.1520654000212543
列表理解更快。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.