将字符串转换为大端,索引超出范围

时间:2013-01-26 05:02:28

标签: python math

我正在尝试将字符串转换为大端,但由于我缺乏位移等经验,我到目前为止仍遇到以下情况:

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

1 个答案:

答案 0 :(得分:1)

不使用其他方法,只需要从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'))