4

私はPythonでchar配列を持っています。これはファイルから読み取られます。

char_array = [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f]

これを次のような整数の配列に変換/型キャスト/アクセスするにはどうすればよいですか?

int_array[0] = 0x03020100
int_array[1] = 0x07060504
int_array[2] = 0x0b0a0908
int_array[3] = 0x0f0e0d0c

C / C ++で整数としてバイトの配列にアクセスする方法と似ています。つまり、unsignedchar*をunsignedlong*に型キャストします。

4

2 に答える 2

1

このようなものかもしれません:

>>> def toInt(arr, idx):
...     res = 0
...     for i in xrange(4):
...       res |= (arr[idx*4 + i] << 8*i)
...     return res
... 

>>> '%08x' % toInt(char_array, 0)
'03020100'

>>> '%08x' % toInt(char_array, 1)
'07060504'

を使用したよりエレガントなソリューションがあるかもしれませんstruct

于 2012-04-11T11:36:02.117 に答える
0

それが最も効率的な方法かどうかはわかりませんが、非常にエレガントに見えます:

from itertools import izip_longest
from struct import pack_into, unpack_from

def convert(bytes):
    it = iter(bytes)
    arr = bytearray(4)
    buf = buffer(arr)
    # a grouping trick (see itertools examples)
    for group in izip_longest(*[it]*4, fillvalue=0):
        # pack 4 bytes, then unpack high-endian
        pack_into('bbbb', arr, 0, *group)            
        intval, = unpack_from('<i', buf)
        yield hex(intval)


char_array = [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f]

print list(convert(char_array))
# ['0x3020100', '0x7060504', '0xb0a0908', '0xf0e0d0c']
于 2012-04-11T11:41:24.923 に答える