python是否提供用于uuencoding的特殊字符列表?

时间:2018-11-17 02:53:20

标签: python uuencode

我可以在Wikipedia上找到uuencode字符映射。 python有没有办法遍历此列表?

for x in [builtin_uuencode_mappings]:
    print(x)

我想重点关注诸如“!@#$”等特殊字符。

1 个答案:

答案 0 :(得分:2)

Python已经内置了对uuencoded消息进行编码和解码的支持。

from codecs import encode  # decode also works
print(encode("my message", 'uu'))
# -> 'begin 666 <data>\n*;7D@;65S<V%G90  \n \nend\n'

内部,python使用binascii包逐行编码或解码消息。我们可以使用它来对range(64)中的单个字节甚至所有字节进行编码(因为uuencoding将6位转换为ascii字符:2**6 == 64)。

要生成所有必需的位模式,我们可以计数到64,并将结果向左移动2位。这样,最高的6位从0到64计数。然后,只需将其转换为python bytes,对其进行uenencode并提取实际字符即可。

在python2中

from binascii import b2a_uu
for byte in range(64):
    pattern = chr(byte << 2)  # str and bytes are identical in python2
    encoded = b2a_uu(pattern)
    character = encoded[1]  # encoded[0] is the character count in that line
    print "{:2} -> {!r}".format(byte, character)

在python3中,第一部分有点难看。

from binascii import b2a_uu
for byte in range(64):
    pattern = bytes([byte << 2])  # chr().encode() will not work!
    encoded = b2a_uu(pattern)
    character = chr(encoded[1]) 
    print(f"{byte:2} -> {character!r}")

感谢Mark Ransom解释了为什么移位确实有效。