将二进制数切分为五位一组

3 投票
7 回答
3569 浏览
提问于 2025-04-16 06:07

有没有什么简单的方法可以把二进制数字切分成五位一组,在Python中实现呢?

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

补充说明:

我想写一个加密器/编码器,目的是生成“方便通过电话阅读”的令牌。标准的base32编码有以下几个缺点:

  • 可能会生成意外的脏话
  • 使用了一些让人困惑的字符,比如'I'、'L'、'O'(可能会和0和1搞混)
  • 容易猜测的序列(比如“AAAA”、“AAAB”等)

我用20行Python代码实现了自己的编码器,感谢大家的帮助。我的编码器去掉了'I'、'L'、'O'和'U',生成的序列很难被猜到。

7 个回答

1

根据你的评论,你实际上是想要32进制的字符串。

>>> import base64
>>> base64.b32encode("good stuff")
'M5XW6ZBAON2HKZTG'
6
>>> [''.join(each) for each in zip(*[iter(s)]*5)]
['00010', '10001', '10111', '01101', '11010', '00101']

或者:

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

[编辑]

这个问题是由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']
6

在编程中,有时候我们会遇到一些问题,特别是在使用某些工具或库的时候。比如,有人可能在使用一个叫做“库”的东西时,发现它的某些功能不太好用,或者在运行代码的时候出现了错误。

这时候,我们可以去一个叫做StackOverflow的网站上寻求帮助。这个网站上有很多程序员,他们会分享自己的经验和解决方案。你可以在上面提问,或者搜索别人遇到过的类似问题。

总之,StackOverflow是一个很好的资源,可以帮助你解决编程中的各种疑难杂症。

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

撰写回答