【问题标题】:How to add and remove random bit padding in Python如何在 Python 中添加和删除随机位填充
【发布时间】:2019-01-20 19:40:54
【问题描述】:

更新:我有一个表示位值的整数列表:

bits = [1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1]
len(bits) == 30

我的问题是如何添加随机位填充以使位的长度为 32,以及如何删除填充?
在我有比特长度的情况下也是如此,比如说 20,如何添加 4 位填充使其变为 24 以及如何移除 4 位填充?

【问题讨论】:

  • 这不是位列表,而是整数对象列表
  • 到目前为止你的方法是什么,为什么没有奏效?

标签: python list padding


【解决方案1】:

这是提取到函数中的一种方法:

import random

def add_padding(seq, num_bits):
    pad_size = num_bits - len(seq) 
    return [random.choice([0, 1]) for _ in range(pad_size)] + seq


bit = [1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1]
print(len(bit))

padded = add_padding(bit, 32)
print(len(padded))   # <-- now a 32 bits sequence

要删除填充,您需要以某种方式记住添加到序列中的位数,然后删除它们;也许切片:

unpadded = padded[num_bits_added:]   # <-- restores the original sequence of bits

[编辑]:调整到最接近的包含字节数:

import random

def adjust_a_byte(seq):
    if len(seq) % 8 == 0 and len(seq) > 0:  # an empty sequence will return an 8 bit sequence (all padding)
        pad_size = 0
    else:
        pad_size = 8 * (len(seq) // 8 + 1) - len(seq)
    print('len(seq):', len(seq), 'len(seq) % 8:', len(seq) % 8, 'pad', pad_size)
    return random.choices([0, 1], k=pad_size) + seq

bit = [1, 0, 1, 1, 1, 1, 1, 1]
print(len(bit))

padded = adjust_a_byte(bit)
print(len(padded)) # <-- now a multiple of 8 bits sequence

【讨论】:

  • 你为什么要这样使用 random.choice?
  • 好的,明白了,我今天早上超级笨!感谢您的提醒
  • 对于 python >= 3.6 你可以做random.choices([0, 1] k=pad_size)
  • @Reblochon Masque 我还有一个问题。如果我的位长度为 7 或 13,如何使代码自动为 7 加 1,使其变为 8。同样适用于 13,它可以自动加 3 使其变为 16?
  • 我在回答中添加了对这个新问题的回答。
猜你喜欢
  • 1970-01-01
  • 2015-06-23
  • 1970-01-01
  • 2010-10-14
  • 2013-05-18
  • 1970-01-01
  • 2011-11-11
相关资源
最近更新 更多