gpt4 book ai didi

python字节到位串

转载 作者:行者123 更新时间:2023-12-03 21:59:24 24 4
gpt4 key购买 nike

我有类型 bytes 的值需要转换为BIT STRINGbytes_val = (b'\x80\x00', 14)
索引零中的字节需要转换为长度由第二个元素(在本例中为 14)指示的位串,并格式化为如下所示的 8 位组。

预期输出 => '10000000 000000'B
另一个例子

bytes_val2 = (b'\xff\xff\xff\xff\xf0\x00', 45) #=> '11111111 11111111 11111111 11111111 11110000 00000'B

最佳答案

格式化的一些组合(下面使用 f-string 但可以通过其他方式完成)和切片怎么样:

def bytes2binstr(b, n=None):
s = ' '.join(f'{x:08b}' for x in b)
return s if n is None else s[:n + n // 8 + (0 if n % 8 else -1)]

如果我理解正确(我不确定最后的 B 是什么意思),它会通过您的测试和更多测试:
func = bytes2binstr
args = (
(b'\x80\x00', None),
(b'\x80\x00', 14),
(b'\x0f\x00', 14),
(b'\xff\xff\xff\xff\xf0\x00', 16),
(b'\xff\xff\xff\xff\xf0\x00', 22),
(b'\x0f\xff\xff\xff\xf0\x00', 45),
(b'\xff\xff\xff\xff\xf0\x00', 45),
)
for arg in args:
print(arg)
print(repr(func(*arg)))
# (b'\x80\x00', None)
# '10000000 00000000'
# (b'\x80\x00', 14)
# '10000000 000000'
# (b'\x0f\x00', 14)
# '00001111 000000'
# (b'\xff\xff\xff\xff\xf0\x00', 16)
# '11111111 11111111'
# (b'\xff\xff\xff\xff\xf0\x00', 22)
# '11111111 11111111 111111'
# (b'\x0f\xff\xff\xff\xf0\x00', 45)
# '00001111 11111111 11111111 11111111 11110000 00000'
# (b'\xff\xff\xff\xff\xf0\x00', 45)
# '11111111 11111111 11111111 11111111 11110000 00000'

解释
  • 我们从 bytes 开始对象
  • 遍历它给我们一个单字节的数字
  • 每个字节是 8 位,因此解码已经为我们提供了正确的分隔
  • 每个字节都使用 b 格式化二进制说明符,带有一些额外的格式:0零填充,8最小长度
  • 我们使用 ' ' 加入(连接)格式化的结果作为“分隔符”
  • 最后,结果按原样返回,如果最大位数 n未指定(设置为 None ),否则结果将被裁剪为 n + 在 8 个字符组之间添加的空格数。


  • 在上面的解决方案中 8有点硬编码。
    如果您希望它是一个参数,您可能需要查看(可能是) @kederrac first answer使用 int.from_bytes() .
    这可能看起来像:
    def bytes2binstr_frombytes(b, n=None, k=8):
    s = '{x:0{m}b}'.format(m=len(b) * 8, x=int.from_bytes(b, byteorder='big'))[:n]
    return ' '.join([s[i:i + k] for i in range(0, len(s), k)])

    这给出了与上面相同的输出。

    极速, int.from_bytes()基于的解决方案也更快:
    for i in range(2, 7):
    n = 10 ** i
    print(n)
    b = b''.join([random.randint(0, 2 ** 8 - 1).to_bytes(1, 'big') for _ in range(n)])
    for func in funcs:
    print(func.__name__, funcs[0](b, n * 7) == func(b, n * 7))
    %timeit func(b, n * 7)
    print()
    # 100
    # bytes2binstr True
    # 10000 loops, best of 3: 33.9 µs per loop
    # bytes2binstr_frombytes True
    # 100000 loops, best of 3: 15.1 µs per loop

    # 1000
    # bytes2binstr True
    # 1000 loops, best of 3: 332 µs per loop
    # bytes2binstr_frombytes True
    # 10000 loops, best of 3: 134 µs per loop

    # 10000
    # bytes2binstr True
    # 100 loops, best of 3: 3.29 ms per loop
    # bytes2binstr_frombytes True
    # 1000 loops, best of 3: 1.33 ms per loop

    # 100000
    # bytes2binstr True
    # 10 loops, best of 3: 37.7 ms per loop
    # bytes2binstr_frombytes True
    # 100 loops, best of 3: 16.7 ms per loop

    # 1000000
    # bytes2binstr True
    # 1 loop, best of 3: 400 ms per loop
    # bytes2binstr_frombytes True
    # 10 loops, best of 3: 190 ms per loop

    关于python字节到位串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60579197/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com