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

4
我知道我可以做到这个:
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

但我在想是否有更简单的方法来做到这一点,而且我希望不使用任何循环结构。

谢谢!


你是说你想将整个文件内容呈现为位字符串吗? - DarkKnight
是的!并且带有前导零。 - user19773037
3个回答

1

看起来你想要将整个文件内容打印为位字符串。

如果是这样,你可以这样做:

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())))

...这种方法避免了显式循环,但有可能会使用过多的内存。


谢谢,但我知道这个。我想直接做而不是用for循环。 - user19773037
2
你的问题中没有提到如何避免使用显式循环。请编辑你的问题。 - DarkKnight

1
你可以使用 str.format 方法将每个字节映射到一个8位表示,并将字节表示连接成一个字符串进行输出(其中b是从文件中读取的bytes对象):
print(''.join(map('{:08b}'.format, b)))

0
你可以使用sys.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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接