3

我正在尝试将字符串转换为大端,但由于我缺乏位移等经验,到目前为止我一直坚持以下几点:

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

4

1 回答 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'))
于 2013-01-26T05:19:18.100 回答