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

3 投票
1 回答
977 浏览
提问于 2025-04-17 13:43

我正在尝试把一个字符串转换成大端格式,但由于我对位移等操作不太熟悉,目前遇到了一些问题,进展到这里:

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),并且在循环中索引从来没有超过#4。

错误信息指向了a[]这个列表。

有没有人能看出我哪里出错了?我正在把这个代码从JavaScript移植过来,所以这可能是问题所在(链接在这里 http://pastebin.com/GKE3AeCm

1 个回答

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'))

撰写回答