我需要从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的含义是什么?
答案 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