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