需要帮助理解一个简短的python代码

时间:2016-10-07 05:44:47

标签: python

我想强调的是,这不是要求完成我的作业或工作:我正在研究用于gif文件压缩的​​LZW算法,通过阅读github上的某些人的代码,并且被一个混淆了代码块在这里:

class DataBlock(object):

    def __init__ (self):
        self.bitstream = bytearray()
        self.pos = 0

    def encode_bits (self, num, size):
        """
        Given a number *num* and a length in bits *size*, encode *num* 
        as a *size* length bitstring at the current position in the bitstream.
        """
        string = bin(num)[2:]
        string = '0'*(size - len(string)) + string
        for digit in reversed(string):
            if len(self.bitstream) * 8 <= self.pos:
                self.bitstream.append(0)
            if digit == '1':
                self.bitstream[-1] |= 1 << self.pos % 8
            self.pos += 1

我无法理解的是函数for中的encode_bits()循环:

for digit in reversed(string):
    if len(self.bitstream) * 8 <= self.pos:
        self.bitstream.append(0)
    if digit == '1':
        self.bitstream[-1] |= 1 << self.pos % 8
    self.pos += 1

这是我的猜测(取决于他的评论):

函数encode_bits()将输入整数num转换为长度为size的二进制字符串(如果需要,在左边填充零)并反转字符串,并将数字追加到{ {1}}一个接一个。于是 假设bitstream,然后s=DataBlock()首先将3转换为s.encode_bits(3, 3)(在左边填充零以使其长度为3)并将其反转为011,然后追加{{} 1}}到110,因此结果应该是110但是当我运行代码时,结果会给出self.bitstream,而不是预期的。更进一步,bytearray('110').是一个字节,而不是3位,与他的评论冲突,我不明白为什么?

我忘了添加他的代码运行并提供正确的输出,因此我的理解有些不对。

1 个答案:

答案 0 :(得分:0)

尝试以这种方式看待它:

  • 您将获得bytearray个对象(暂时称之为x)。
  • 对象中有多少字节? (显然,它只是len(x)。)
  • 对象中有多少? (这是一个练习;请计算答案。)

完成后,假设我们在x中没有(零)字节开头,即xbytearray(b'')。为了存储三个,我们需要添加多少个字节x.append(...))?如果我们想存储8位怎么办?如果我们想存储十位怎么办?

同样,这些都是练习。计算答案,你应该开悟。

(顺便提一下,这种将一些子对象压缩到更大空间的技术称为打包。在数学中问题是generalized,而在计算机中它是often more limited。 {3}}。)