我正在尝试将字符串转换为大端,但由于我缺乏位移等经验,我到目前为止仍遇到以下情况:
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)
答案 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'))