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 バージョンからより正確に調整する必要があります。JavascriptArrayでは特定の長さの を作成していますが、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 つのオブジェクトのシーケンスを raw バイトと見なし、それらをアンパックして整数を構築することです。を使用し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 に答える