【问题标题】:Python: Trying to split instream into bit sized chunksPython:试图将流内分割成比特大小的块
【发布时间】:2019-07-23 07:08:06
【问题描述】:

目前我正在读取一个流内并将其拼接成 3 个字节的块:

instream_chunks = [instream[i:i+3]for i in range (0, len(instream), 3)]

我没有做的是将此内流拆分为 22 位大小的块。有没有办法在 Python 中做到这一点?

编辑:流媒体是这样创建的(用于测试目的):

instream = open('C:/xxx/test.txt', 'rb+')

然后这个instream被用在这个函数中

def write(self, instream: typ.BinaryIO):

从我上面描述的开始。

【问题讨论】:

  • 是什么阻止了你[instream[i:i+22]for i in range (0, len(instream), 22)]
  • 这将使块大小为 22 字节,而我希望它们是位大小的。为了进一步解释这一点:读取的数据应该被分成 22 位大小的块,以便它们可以写入二进制流中的特定字段。
  • 如果 instream 的每个元素都是一个字节,那么您必须拆分各个元素,例如将 instream 从一个可迭代的字节转换为一个位。
  • 内流实际上并没有定义元素,因为它是一个二进制流。它可以是文本文件、用户输入甚至是图片文件。我目前正在尝试从流中读取 22 位,但 .read() 函数似乎也没有任何特定的位功能。
  • 是的,但是在不知道您从何处获得此视频流的情况下,我无法进一步帮助您。 stackoverflow.com/help/mcve

标签: python binary byte bit


【解决方案1】:

假设您有足够的内存,您可以将 instream 转换为位列表,然后根据需要对其进行切片。

def access_bit(data, num):
    base = int(num/8)
    shift = num % 8
    return (data[base] & (1<<shift)) >> shift

def to_bits(instream):
    ba = bytearray(instream.read())
    return [access_bit(ba,i) for i in range(len(ba)*8)]

&gt;&gt;&gt;to_bits(open('test.txt','rb'))

[0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0]

否则,您将不得不以所需大小的倍数读取较小的块,然后对每个块使用上述方法。例如,您读取 22*4 = 88 位或 11 个字节,然后对其调用 to_bits,将结果数组拆分为 4 个 22 位块,然后重复。

【讨论】:

  • 谢谢,这太完美了。
猜你喜欢
  • 2017-05-24
  • 1970-01-01
  • 2013-12-05
  • 1970-01-01
  • 2014-04-25
  • 1970-01-01
  • 2018-11-24
  • 2014-04-11
  • 1970-01-01
相关资源
最近更新 更多