【问题标题】:Python base64.b64encode. How to obtain the 6 bit value for each encoded character?Python base64.b64 编码。如何获取每个编码字符的 6 位值?
【发布时间】:2017-08-27 02:13:58
【问题描述】:

例如说我执行

base64.b64encode('Monday')

获得'TW9uZGF5'。但是当我想访问每个字符的 6 位时,我会得到类似这样的信息(每个字符的 ASCII 值):

[84 87 57 117 90 71 70 53]

当我想获得 6 位(0 到 63 之间的值)等价物时:

[19 22 61  46 25  6  5 57]

有没有办法做到这一点,而无需遍历列表并相应地手动更改它们?

谢谢!

【问题讨论】:

  • 你需要做位操作(shifting, anding, oring)

标签: python python-3.x base64 ascii bit


【解决方案1】:

只需像在 c 中一样使用掩码:

a & 63

您还可以将数字移位以获得高 6 位:

a >> 2 & 63

简单的方法:

translate_dict = {
    'A': 0, 'Q': 16, 'g': 32, 'w': 48,
    'B': 1, 'R': 17, 'h': 33, 'x': 49,
    'C': 2, 'S': 18, 'i': 34, 'y': 50,
    'D': 3, 'T': 19, 'j': 35, 'z': 51,
    'E': 4, 'U': 20, 'k': 36, '0': 52,
    'F': 5, 'V': 21, 'l': 37, '1': 53,
    'G': 6, 'W': 22, 'm': 38, '2': 54,
    'H': 7, 'X': 23, 'n': 39, '3': 55,
    'I': 8, 'Y': 24, 'o': 40, '4': 56,
    'J': 9, 'Z': 25, 'p': 41, '5': 57,
    'K': 10, 'a': 26, 'q': 42, '6': 58,
    'L': 11, 'b': 27, 'r': 43, '7': 59,
    'M': 12, 'c': 28, 's': 44, '8': 60,
    'N': 13, 'd': 29, 't': 45, '9': 61,
    'O': 14, 'e': 30, 'u': 46, '+': 62,
    'P': 15, 'f': 31, 'v': 47, '/': 63
}

print([translate_dict[sym] for sym in 'TW9uZGF5'])

【讨论】:

  • 当我这样做时,它会导致: [20 23 57 53 26 7 6 53] 但我想要类似: [19 22 61 46 25 6 5 57] 根据这张表( en.wikipedia.org/wiki/Base64)
  • 为什么是 84 -> 19? bin(84) -> '0b1010100', bin(19) -> '0b10011'
  • 因为这是 'T' 的适当 6 位值,根据我之前评论链接中的 Base64 索引表。
  • 这适用于大写字母,但不幸的是不适用于其余字母,因为在 ASCII 中,大写、小写和数字之间存在字符,但对于 Base 64,它只是 0:25 = 大写, 26:51 = 小写,52:63 = 0:9 和 '+' 和 '/'
【解决方案2】:

您的问题被标记为 Python 3.x,但您不能在 Python 3.x 中将字符串传递给 base64.b64encode(需要改为传递字节)。无论如何,这显示了如何在任一版本上执行此操作,但它并未针对任一版本进行特别优化:

import base64


codes = list(range(ord('A'), ord('Z')+1))
codes += list(range(ord('a'), ord('z')+1))
codes += list(range(ord('0'), ord('9')+1))
codes.extend((ord('+'), ord('/')))

remap = dict(zip(codes, range(64)))

print([remap[x] for x in bytearray(base64.b64encode(b'Monday'))])

【讨论】:

    猜你喜欢
    • 2021-09-22
    • 2012-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-31
    • 2021-10-27
    相关资源
    最近更新 更多