用于python的perl pack / unpack(B *)函数的类比?

时间:2017-05-14 16:33:21

标签: python python-3.x

我需要从packs byte string的perl端口代码。在perl中,它看起来如下:

pack 'B*', '0100001000111110010100101101000010010001'

我在python struct module中看不到B*格式模拟。也许有没有现成的解决方案不发明自行车?

老实说,description is not clear for me, so i even can't imagine how it works由我自己实施:

  

同样,b和B格式包含一个字符串就是那么多位   长。每种这样的格式都会产生1位结果。这些是   通常接着是重复计数,如B8或B64。

     

每个结果位   基于相应输入的最低有效位   字符,即on ord($ char)%2。特别是字符“0”和   “1”生成位0和1,字符“\ 000”和“\ 001”也是如此。

     

从输入字符串的开头开始,每个8元组   字符转换为输出的1个字符。

     

格式为b,   8元组的第一个字符决定了最不重要的位   一个人物;格式B,它确定最重要的位   一个人物。

     

如果输入字符串的长度不可均分   如图8所示,其余部分被打包,好像输入字符串被填充一样   最后的空字符。同样在解包时,“额外”位   被忽略了。

     

如果输入字符串比需要的长,则保留   字符被忽略。

     

重复计数的A *使用所有字符   输入字段。在解包时,位被转换为0的字符串   s和1 s。

因此,字符串被分成8个符号的块。如果最后一个块少于8个符号,则最后用空字符填充为8个符号。然后,每个块都变成一个字节。

但我无法理解,结果是什么? B8和B64的含义是什么?

2 个答案:

答案 0 :(得分:2)

int - 对象有to_bytes - 方法:

binary = '0100001000111110010100101101000010010001'
number = int(binary, 2)
print(number.to_bytes((number.bit_length()+7)//8, 'big'))
# b'B>R\xd0\x91'

答案 1 :(得分:1)

我不确定perl的语义是否正确,但我在猜他们:

def pack_bit_string(bs):
    ret = b''
    while bs:
        chunk, bs = bs[:8], bs[8:]
        # convert to an integer so we can pack it
        i = int(chunk, 2)
        # Handle trailing chunks that are not 8 bits
        # Note this as an augmented assignment, perhaps also read as
        # i = i << (8 - len(chunk))
        i <<= 8 - len(chunk)
        ret += struct.pack('B', i)
    return ret

评论是内联的。如果您知道&#34;输入小于64位&#34;你可以避免循环并使用Q来构造struct.pack