2012-04-11 4 views
3

У меня есть массив символов в Python, который считывается из файла, например.Задание или доступ к массиву символов массиву массива в Python

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++, т.е. типа отливать без знака char * к unsigned long *.

+3

Я подозреваю, что вы пытаетесь сделать что-то в Python очень unidiomatic образом. Может быть, это поможет, если бы вы описали общую картину того, чего вы пытаетесь достичь? –

ответ

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?

+0

На самом деле кажется, что это то, что я искал char_array = '\ x00 \ x01 \ x02 \ x03 \ x04 \ x05 \ x06 \ x07 \ x08 \ x09 \ x0a \ x0b \ x0c \ x0d \ x0e \ x0f' int_array = unpack ('4L', char_array) –

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'] 
Смежные вопросы