[英]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.