如何无循环将未知长度Bytes转换为带前导零的Bits?
问题
已知单个字节转带前导零的二进制字符串可以这么实现:
byte = 58 format(byte, '08b') >>> '00111010'
处理两个字节时则使用:
format(bytes, '016b')
但如果不知道字节数量,没法在format里指定固定的长度参数,我目前的实现方式是:
with open('file','rb')as a: b = a.read() c = int.from_bytes(b) d = format(c,'b') d = (8 - len(b)%8)*'0' + d
想找到更简便的实现方法,要求不使用任何循环。
解答
这里有两种更简洁的实现方案,均满足无循环的要求:
方法一:动态生成格式化长度
直接通过字节长度计算所需的总二进制位数,用动态格式化字符串一步完成转换:
with open('file', 'rb') as a: b = a.read() d = format(int.from_bytes(b), f'0{len(b)*8}b')
len(b)*8直接得到二进制字符串需要的总长度,将其嵌入格式化符号0{len(b)*8}b后,format会自动补全前导零,无需额外的补零操作。
方法二:借助binascii模块转换
如果不想通过整数中转,也可以用binascii模块先转十六进制,再补全二进制前导零:
import binascii with open('file', 'rb') as a: b = a.read() hex_str = binascii.hexlify(b).decode() d = bin(int(hex_str, 16))[2:].zfill(len(b)*8)
zfill(len(b)*8)会自动在二进制字符串左侧补零,直到长度符合字节数×8的要求,全程没有循环操作。
内容的提问来源于stack exchange,提问作者user19773037
相关产品推荐
相关产品推荐

