繁体   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