将字符串转换为大端,索引超出范围
我正在尝试把一个字符串转换成大端格式,但由于我对位移等操作不太熟悉,目前遇到了一些问题,进展到这里:
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'))