将二进制数切成五位数组

Pau*_*ine 3 python slice

是否有任何巧妙的技巧将二进制数切成python中的五位数组?

'00010100011011101101110100010111'=> ['00010','00110','10111',...]

编辑:我想编写一个密码/编码器,以便生成"易于通过手机阅读"的令牌.标准的base32编码具有以下缺点:

  • 有可能产生意外的f*字
  • 使用像'I','L','O'这样的混乱字符(可能与0和1混淆)
  • 易于猜测的序列("AAAA","AAAB",...)

感谢大家,我能够在20行python中自己动手.我的编码器不使用'I','L','O'和'U',结果序列很难猜测.

Gre*_*ill 6

>>> a='00010100011011101101110100010111'
>>> [a[i:i+5] for i in range(0, len(a), 5)]
['00010', '10001', '10111', '01101', '11010', '00101', '11']
Run Code Online (Sandbox Code Playgroud)


pil*_*her 6

>>> [''.join(each) for each in zip(*[iter(s)]*5)]
['00010', '10001', '10111', '01101', '11010', '00101']
Run Code Online (Sandbox Code Playgroud)

要么:

>>> map(''.join, zip(*[iter(s)]*5))
['00010', '10001', '10111', '01101', '11010', '00101']
Run Code Online (Sandbox Code Playgroud)

[编辑]

Greg Hewgill提出了这个问题,如何处理两个尾随位?以下是一些可能性:

>>> from itertools import izip_longest
>>>
>>> map(''.join, izip_longest(*[iter(s)]*5, fillvalue=''))
['00010', '10001', '10111', '01101', '11010', '00101', '11']
>>>
>>> map(''.join, izip_longest(*[iter(s)]*5, fillvalue=' '))
['00010', '10001', '10111', '01101', '11010', '00101', '11   ']
>>>
>>> map(''.join, izip_longest(*[iter(s)]*5, fillvalue='0'))
['00010', '10001', '10111', '01101', '11010', '00101', '11000']
Run Code Online (Sandbox Code Playgroud)