我想把一个字符串转换成一个大尾数,但由于我缺乏移位等方面的经验,到目前为止,我一直坚持以下几点:

def my_func(self, b):
    a = [(len(b)+3) >> 2]

    for i, val in enumerate(b):
        a[i>>2] |= ord(b[i]) << (24-(i & 3)*8)
    return a

以上返回错误
a[i>>2] |= ord(b[i]) << (24-(i & 3)*8)IndexError: list index out of range,也永远无法通过循环索引超过4。
错误消息指向a[]列表。
有人知道我做错了什么吗?我是从JavaScript移植的,所以这可能是问题所在(链接到http://pastebin.com/GKE3AeCm

最佳答案

不需要使用其他方法,只需要从Javascript版本中更正确地调整代码。在Javascript中,您正在创建一个具有一定长度的Array,但在Python代码中,您总是创建一个大小为1的列表。这是正确的:

def my_func(b):
    a = [0] * ((len(b)+3) >> 2)

    for i, val in enumerate(b):
        a[i>>2] |= ord(b[i]) << (24-(i & 3)*8)
    return a

因此,您要做的是将4个对象的序列视为原始字节,并将它们解包以生成一个整数。使用struct,正确的方法是显式地将数据作为字节传递:
import struct

def my_func2(data):
    lb = len(data)
    if lb % 4:
        data += b'\x00' * (4 - (lb % 4))
    a = [struct.unpack('>i', data[i:i+4])[0] for i in range(0, lb, 4)]
    return a

print(my_func2(b'pass123'))

关于python - 将字符串转换为大端,索引超出范围,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14534044/

10-12 22:13