python 将字节转换为带前导零的位

kcwpcxri  于 2023-04-28  发布在  Python
关注(0)|答案(4)|浏览(122)

我知道我能做到:

byte = 58

format ( byte , '08b' )

>>> '00111010'

有两个字节我必须做的
format( bytes , '016b')
但是如果我没有字节数,我就不能为格式设置一个数字,所以我必须这样做:

with open('file','rb')as a:
    b = a.read()
    c = int.from_bytes ( b )
    d = format( c ,'b')
d = (8-len(a)%8)*'0'+d

但我想知道是否有更简单的方法来做到这一点,我希望这不使用任何循环
谢谢!

eqqqjvef

eqqqjvef1#

您可以使用str.format方法将每个字节Map到8位表示形式,然后将字节表示形式连接到单个字符串中以进行输出(其中b是从文件中读取的bytes对象):

print(''.join(map('{:08b}'.format, b)))
dbf7pr2w

dbf7pr2w2#

看起来好像您希望将整个文件内容打印为位字符串。
如果是这样,您可以这样做:

with open('foo.txt', 'rb') as bdata:
    print(''.join(f'{b:08b}' for b in bdata.read()))

或者...

with open('foo.txt', 'rb') as bdata:
    for b in bdata.read():
        print(f'{b:08b}', end='')
print()

。。。这样会占用更少的内存
或者...

def _format(b):
    return format(b, '08b')

with open('foo.txt', 'rb') as bdata:
    print(''.join(map(_format, bdata.read())))

。。。这避免了显式循环,冒着使用过多内存的风险

mhd8tkvw

mhd8tkvw3#

你可以使用系统。getsizeof()

import sys

byte = 58
num_bytes = sys.getsizeof(byte)
binary_string = format(byte, f'0{num_bytes*8}b')

byte = 58
num_bytes = (byte.bit_length() + 7) // 8
binary_string = format(byte, f'0{num_bytes*8}b')

如果不管用

byte = 58
num_bytes = (byte.bit_length() + 7) // 8
byte_string = byte.to_bytes(num_bytes, byteorder='big')
binary_string = ''.join(format(b, '08b') for b in byte_string)
pgccezyw

pgccezyw4#

由于Map没有被优化,因此,我建议使用我刚才使用的方法。

相关问题