为什么Python中遍历bytes对象存入列表时元素会转换为int类型
问题解答
核心原因
这是Python bytes 类型的原生设计逻辑:bytes 本质是由 0~255 范围内整数构成的不可变序列,直接遍历 bytes 对象时,返回的每个元素就是对应字节的十进制整数值,而非长度为1的bytes对象。
你打印完整bytes变量时看到的\x1d、B这类表现形式,只是Python为了提升可读性做的格式化输出,并非bytes的内部存储形式。
适配方案
如果你需要转置后的列表元素保持单字节bytes类型,可通过两种方式修改transpose函数:
方案1:整数转单字节bytes
遍历得到整数后,用bytes([c])转换为单字节bytes再存入列表:
def transpose(data, n): buckets = [[] for _ in range(n)] i = 0 for c in data: # 仅修改这一行,整数转单字节bytes buckets[i].append(bytes([c])) i = (i + 1) % n return buckets
方案2:切片取值
通过索引切片读取bytes,切片操作返回的结果始终是bytes类型:
def transpose(data, n): buckets = [[] for _ in range(n)] for idx in range(len(data)): buckets[idx % n].append(data[idx:idx+1]) return buckets
额外说明
如果你后续要做单字节异或破解这类密码分析操作,直接用整数计算反而更便捷,不需要额外转回bytes类型。
内容的提问来源于stack exchange,提问作者NotQuiteSo1337
相关产品推荐
相关产品推荐

